|
Программирование >> Oracle
1446 Глава 21 врат значения Null равносилен возвращению пустого условия. В представленном выше примере вместо пустой строки можно было с тем же результатом возвращать Null. Чтобы связать функцию с таблицей, используется рассматриваемая далее PL/SQL-процедура DBMS RLS.ADD POLICY. В нашем примере имеется следующая таблица, а сеанс выполняется от имени пользователя TKTE: tkyte@TKYTE816> create table datatable 2 (somedata varchar2(60), 3 OWNER varchar2(30) default US Table created. tkyte@TKYTE816> grant all on data table to public-Grant succeeded. tkyte@TKYTE816> create public synonym data table for data table; Synonym created. tkyte0TKYTE816> insert into data table (some data) values (Некие данные); 1 row created. tkyte@TKYTE816> insert into data table (some data, owner) 2 values (Некие данные, принадлежащие пользователю SGOTT, SGOTT); 1 row created. tkyte0TKYTE816> commit; Commit complete. tkyte0TKYTE816> select * from datatable; SOME DATA OWNER Некие данные TKTE Данные, принадлежащие пользователю SCOTT SCOTT Теперь привяжем написанную ранее функцию защиты к этой таблице с помощью следующего обращения к пакету DBMS RLS: tkyte@TKYTE816> begin 2 dbms rls.add policy 3 (object schema => TKYTE, 4 object name => data table, 5 policy name => MY POLIGY, 6 function schema => TKYTE, 7 policy function => security policy function, 8 statement types => select, insert, update, delete, 9 update check => TRUE, 10 enable => TRUE 11 ); 12 end; 13 / PL/SQL procedure successfully completed. Тщательный контроль доступа 1447 Процедура ADD POLICY - одна из ключевых процедур пакета DBMS RLS. Именно она позволяет добавить правило зашиты для таблицы. Мы передали процедуре следующие параметры. OBJECT SCHEMA. Имя владельца таблицы или представления. Если оставить стандартное значение Null, оно будет интерпретироваться как имя текущего зарегистрированного пользователя. Для полноты рассмотренного выше примера я передал имя пользователя. OBJECT NAME. Имя таблицы или представления, для которого добавляется правило. POLICY NAME. Уникальное имя для этого правила. Это имя используется в дальнейшем для включения, отключения, изменения или удаления правила. FUNCTION SCHEMA. Имя владельца функции, возвращающей условие. Оно обрабатывается аналогично параметру OBJECT SCHEMA. Если оставлено стандартное значение Null, используется имя текущего зарегистрированного пользователя. POLICY FUNCTION. Имя функции, возвращающей условие. STATEMENT TYPES. Список типов операторов, к которым применяется правило. Может представлять собой любое сочетание INSERT, UPDATE, SELECT и DELETE, перечисленных через запятую. Стандартное значение - все четыре оператора. Для наглядности я задал список явно. UPDATE CHECK. Этот параметр влияет только на обработку операторов INSERT и UPDATE. Если параметр имеет значение True (стандартное значение - False), будет выполняться проверка, доступны ли вставленные или измененные данные текущему пользователю в соответствии с заданным условием. Другими словами, если задано значение True, нельзя вставить данные, которые нельзя будет выбрать из таблицы в соответствии с возвращаемым функцией условием. ENABLE. Задает, включено это правило или нет. Стандартное значение - True. Теперь, после вызова процедуры ADDPOLICY, ко всем операторам ЯМД, применяемым к таблице DATA TABLE, будет добавляться условие, возвращаемое функцией SECURITY POLICY FUNCTION, независимо от того, из какой среды поступил оператор ЯМД. Другими словами, независимо от приложения, обращающегося к данным. Чтобы увидеть это в действии, выполним: tkyte@TKYTE816>connect system/manager system@TKYTE816>select * from data table; no rows selected system@TKYTE816>connectscott/tiger scott@TKYTE816>select * from data table; SOME DATA OWNER Данные, принадлежащие пользователю SCOTT SCOTT 1448 Глава 21 Итак, этот пример показывает, что строки фильтруются - пользователь SYSTEM не получает из этой таблицы никаких данных. Причина в том, что условие WHERE OWNER = USER не выполняется ни для одной из существующих строк данных. При регистрации от имени пользователя SCOTT, однако, можно получить единственную строку, принадлежащую пользователю SCOTT. Продолжим пример и попытаемся применить к таблице ряд операторов ЯМД: sys@TKYTE816> connect scott/tiger scott@TKYTE816> insert into data table (some data) 2 values (Новые данные) ; 1 row created. scott@TKYTE816>insert into data table (some data, owner) 2 values (Новые данные, принадлежащие пользователю SYS, SYS) insert into data table ( some data, owner ) ERROR at line 1: ORA-28115: policy with check option violation scott@TKYTE816> select * om data table; SOME DATA OWNER Данные, принадлежащие пользователю SCOTT SCOTT Новые данные SCOTT Можно создавать данные, которые будут доступны, но если они недоступны, возвращается сообщение об ошибке ORA-28115, поскольку при добавлении правила в вызове процедуры dbms rls.add policy было передано значение: 9 update check => TRUE); Это аналогично созданию представления с конструкцией CHECK OPTION. Рафе-шается создавать только те данные, которые можно потом выбрать. По умолчанию можно создавать данные, не выбираемые в соответствии с правилами защиты. Теперь, в соответствии с реализованным правилом защиты, владелец таблицы видит все строки и имеет возможность создавать любую строку. Чтобы убедиться в этом, регистрируемся как пользователь TKYTE и пытаемся выполнить следующие действия: scott@TKYTE816> connect tkyte/tkyte tkyte@TKYTE816>insert into data table (some data, owner) 2 values (Новые данные, принадлежащие пользователю SYS, SYS) 1 row created. tkyte@TKYTE816> select * from data table 2 /
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |