CONNECT vpd_admin/vpd_admin
HOST echo CONNECT vpd_admin/vpd_admin > drop_policy.sql
BEGIN DBMS_RLS.DROP_POLICY ( POLICY_NAME => 'epolicy' ,OBJECT_SCHEMA => 'scott' ,OBJECT_NAME => 'emp' ); END; /
SAVE drop_policy APPEND
(Файл drop_policy.sql я создал ради удобства, чтобы более экономно удалить политику во второй раз, ниже по тексту).
BEGIN DBMS_RLS.ADD_POLICY ( POLICY_NAME => 'epolicy' ,OBJECT_SCHEMA => 'scott' ,OBJECT_NAME => 'emp' ,FUNCTION_SCHEMA => 'vpd_admin' ,POLICY_FUNCTION => 'permissions_function' ,SEC_RELEVANT_COLS => 'sal, comm'
); END; /
Проверка:
SQL> CONNECT scott/tiger Connected. SQL> SELECT ename, sal, deptno FROM emp;
ENAME SAL DEPTNO
---------- ---------- ---------- MILLER 1300 10
KING 5000 10
CLARK 2450 10
JAMES 950 30
TURNER 1500 30
BLAKE 2850 30
MARTIN 1250 30
WARD 1250 30
ALLEN 1600 30
9 rows selected.
А вот что получим, если не обратимся к «секретному» столбцу с зарплатой:
SQL> SELECT ename, deptno FROM emp;
ENAME DEPTNO
---------- ---------- SMITH 20
ALLEN 30
WARD 30
JONES 20
MARTIN 30
BLAKE 30
CLARK 10
SCOTT 20
KING 10
TURNER 30
ADAMS 20
JAMES 30
FORD 20
MILLER 10
14 rows selected.
В любом случае защищенных данных мы не увидим, но способ достижения этого своеобразен: как только мы обращаемся к «секретным» столбцам, политика препятствует показу некоторых строк (как и раньше), но если мы к «секретным» столбцам не обращаемся, то пожалуйста – нам даются все строки, словно бы никакой политики и не было.
Довольно необычно: количество доступных строк при запросе к таблице зависит от того, запросили мы «секретный» столбец, или же нет. Более традиционного поведения можно достичь употреблением еще одного нового параметра.
Параметр SEC_RELEVANT_COLS_OPT
Если для него указать константу DBMS_RLS.ALL_ROWS, то при операции SELECT будут выдаваться все строки, но значения в «секретных» столбцах некоторых строк (защищенных политикой) мы не увидим:
@drop_policy
BEGIN DBMS_RLS.ADD_POLICY ( POLICY_NAME => 'epolicy' ,OBJECT_SCHEMA => 'scott' ,OBJECT_NAME => 'emp' ,FUNCTION_SCHEMA => 'vpd_admin' ,POLICY_FUNCTION => 'permissions_function' ,SEC_RELEVANT_COLS => 'sal, comm'