Права доступа предоставляются пользователю на каждую запись отдельно. Все записи базы данных, независимо от того, каким таблицам они принадлежат, разбиваются на несколько непересекающихся множеств - отраслей (department). Конкретный пользователь имеет одинаковые права доступа ко всем записям одной отрасли. В записи может существовать единственное поле натурального типа, в котором указывается номер отрасли - мы будем помечать такие поля как "legal" (правовое). Если на какую-либо операцию с записью у пользователя нет прав, то запись для данного пользователя не существует (он ее не видит в рамках данной операции). Если в записи нет правового поля, то пользователь имеет все права на эту запись. Это поле доступно для записи на тех же основаниях, что и все остальные поля записи.
Любому пользователю, вносящему данные, нужно право на обновление, т.к. он может ошибиться в вносимых значениях. Любой изменяющий поля может записать в них бессмысленные значения или присвоить полям "null" - и то, и другое равносильно удалению записи. Очень странно выглядело бы право на обновление без права на чтение. Отсюда следует, что право на обновление бессмысленно без прав на удаление и чтение и должно быть дополнено ими - такое целостное право назовем правом оперировать (operate = update + delete + read). Таким образом доступ к отраслям принимает только три значения: чтение, оперирование, отсутствие доступа.
Внутри СУБД права одного пользователя резонно объединить в массив, и предоставить доступ к таким массивам через системную таблицу "right2department".
Значение, которое по умолчанию присваивается правовому полю каждой записи, внесенной пользователем в базу данных, называется следом (trace). Имя пользователя, его пароль (в зашифрованном виде) и след перечислены в системной таблице "sys4user".
Записи, полученные графическим интерфейсом, должны иметь пометку о том, может пользователь поля только читать или еще и изменять. Такая однобитная пометка вычисляется на основе значения правового поля и элемента массива 'right' таблицы 'right2department'. Вычисленное значение удобно высылать в самой записи в дополнительном поле типа 'bit1' (0=read only, 1=operate). Такие "вычисленные" поля реально не существуют (и естественно недоступны для записи), и мы будем помечать их как "secondary".