© Владимир Пржиялковский,
координатор Евро-Азиатской Группы Пользователей Oracle,
преподаватель УКЦ Interface Ltd.
| "Я за свечку, Свечка - в печку! Я за книжку, Та - бежать ..." | Корней Чуковский, "Мойдодыр" | 
Эта статья является непосредственным продолжением статьи "Изучаем метки доступа к строкам: специальные привилегии для избранных", и рассматривает некоторые возможности управления правкой полей записей, защищенных метками доступа средствами Label Security в Oracle в соответствии с мандатным доступом.
Подразумеваемые в статье состояние базы и сценарные файлы соответствуют концу предыдущей статьи.
Раньше мы рассмотрели некоторые возможности правки меток, задающих секретность строк (и возможности в виде исключения обходить запреты на правку). А что касается возможностей править обычные поля таблицы, строки которой защищены метками секретности?
Свойство доступа к обычным полям (не к служебному полю секретности строки), ранее использованное, называлось READ_CONTROL. Уточним поведение этого свойства. Выдадим:
@userprivilege employee ''
@phonepolicyoptions 'read_control'
Продолжим:
SQL> CONNECT employee/employee
Connected.
SQL> @phones
| ENAME | PNO | 
| ---------- | -------------------- | 
| ALLEN | 882-3154 | 
| WARD | 610-1718 | 
| MARTIN | 103-1983 | 
| BLAKE | |
| CLARK | |
| KING | |
| TURNER | 293-1398 | 
| JAMES | 932-6728 | 
| MILLER | 865-6706 | 
9 rows selected.
SQL> UPDATE scott.phone
  2  SET pno = pno
  3  WHERE
  4  empno
  5  = ( SELECT empno FROM scott.emp WHERE ename = 'ALLEN' );
1 row updated.
SQL> save updateallenpnumber
Created file updateallenpnumber.sql
SQL> @updateallen OPEN
1 row updated.
SQL> @updateallen LIMITED
1 row updated.
SQL> @updateallen OPEN
0 row updated.
SQL> @updateallenpnumber
0 row updated.
Пока ничего нового относительно меток (пользователю EMPLOYEE, как это и было раньше, позволено "играть" только "на повышение" секретности), а что касается обычных полей разрешенных ему строк, то правка, как показывает пример, возможна.
Однако в нашем распоряжении имеются и другие свойства меток в конкретной таблице, например:
Рассмотрим для примера свойство UPDATE_CONTROL. Выдадим:
@phonepolicyoptions 'update_control'
Повторим проверку:
SQL> CONNECT employee/employee
Connected.
SQL> @phones
| ENAME | PNO | 
| ---------- | -------------------- | 
| ALLEN | 882-3154 | 
| WARD | 610-1718 | 
| MARTIN | 103-1983 | 
| BLAKE | 193-3112 | 
| CLARK | 310-2673 | 
| KING | 542-6672 | 
| TURNER | 293-1398 | 
| JAMES | 932-6728 | 
| MILLER | 865-6706 | 
9 rows selected.
SQL> @updateallen OPEN
1 row updated.
SQL> @updateallenpnumber
1 row updated.
SQL> @updateallen LIMITED
1 row updated.
SQL> @updateallen LIMITED
UPDATE scott.phone
             *
ERROR at line 1:
ORA-12406: unauthorized SQL statement for policy EMPSEC_POLICY
... ... ... ...
SQL> @updateallenpnumber
UPDATE scott.phone
             *
ERROR at line 1:
ORA-12406: unauthorized SQL statement for policy EMPSEC_POLICY
... ... ... ...
Факт налицо: включение UPDATE_CONTROL не изменило наши возможности по изменению метки, однако ж обычные поля запретных для него строк он править уже не в состоянии. Заметьте, что это коснулось только правки, но не чтения. Чтобы вновь защитить обычные поля от прочтения, достаточно выдать:
@phonepolicyoptions 'update_control, read_control'
Доказательство:
SQL> CONNECT employee/employee
Connected.
SQL> @phones
| ENAME | PNO | 
| ---------- | -------------------- | 
| ALLEN | 882-3154 | 
| WARD | 610-1718 | 
| MARTIN | 103-1983 | 
| BLAKE | |
| CLARK | |
| KING | |
| TURNER | 293-1398 | 
| JAMES | 932-6728 | 
| MILLER | 865-6706 | 
9 rows selected.
Свойства INSERT_CONTROL и DELETE_CONTROL аналогичны рассмотренному UPDATE_CONTROL. Свойство же WRITE_CONTROL введено для удобства и обозначает INSERT_CONTROL + UPDATE_CONTROL + DELETE_CONTROL. Это легко обнаруживается следующим образом. Продолжим:
SQL> @showoptions
| POLICY_NAME | SCHEMA_NAME | TABLE_NAME | TABLE_OPTIONS | 
| ---------------------- | ------------ | ------------ | --------------- | 
| EMPSEC_POLICY | SCOTT | EMP | READ_CONTROL, LABEL_DEFAULT | 
| EMPSEC_POLICY | SCOTT | PHONE | READ_CONTROL, UPDATE_CONTROL | 
А теперь выдадим:
@phonepolicyoptions 'write_control, read_control'
Снова проверим свойства ("особенности") применения нашей политики к конкретным таблицам:
SQL> @showoptions
| POLICY_NAME | SCHEMA_NAME | TABLE_NAME | TABLE_OPTIONS | 
| ---------------------- | ------------ | ------------ | --------------- | 
| EMPSEC_POLICY | SCOTT | EMP | READ_CONTROL, LABEL_DEFAULT | 
| EMPSEC_POLICY | SCOTT | PHONE | READ_CONTROL, INSERT_CONTROL, UPDATE_CONTROL, DELETE_CONTROL | 
| INTERFACE Ltd. | 
 | ||||