«Старое» решение
Сначала воспроизведем пример из упомянутой выше по тексту первой статьи с тою разницей, что теперь функция политики доступа к таблице SCOTT.EMP и вспомогательная таблица, регулирующая доступ, создаются в отдельной схеме VPD_ADMIN «администратора политик» (что в методологически более правильно):
CONNECT vpd_admin/vpd_admin
Таблица с данными, параметризующими доступ:
CREATE TABLE permissions_table ( username VARCHAR2(14) , deptno NUMBER (2) );
INSERT INTO permissions_table VALUES ('SCOTT', 10);
INSERT INTO permissions_table VALUES ('SCOTT', 30);
INSERT INTO permissions_table VALUES ('ADAM', 10);
(Полагаем, что пользователь SCOTT будет работать с сотрудниками 10-го и 30-го отделов, а пользователь ADAM – с сотрудниками только 10-го).
Функция, служащая предикатом доступа, задающая фильтр для строк при обращении к таблице SCOTT.EMP:
CREATE OR REPLACE FUNCTION permissions_function ( obj_schema IN VARCHAR2 ,obj_name IN VARCHAR2 ) RETURN VARCHAR2 IS BEGIN RETURN 'deptno IN (SELECT deptno FROM permissions_table ' 'WHERE username = USER)'; END; /
Политику доступа к таблице SCOTT.EMP по-прежнему назовем EPOLICY:
BEGIN DBMS_RLS.ADD_POLICY ( POLICY_NAME => 'epolicy' ,OBJECT_SCHEMA => 'scott' ,OBJECT_NAME => 'emp' ,FUNCTION_SCHEMA => 'vpd_admin' ,POLICY_FUNCTION => 'permissions_function' ); END; /
GRANT EXECUTE ON permissions_function TO scott;
Проверка:
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.
Новые параметры политики доступа в версии 10
В версии 10.1 у процедуры DBMS_RLS.ADD_POLICY появились новые необязательные (умолчательное значение – NULL) параметры:
Параметр SEC_RELEVANT_COLS
Здесь через запятую указываются столбцы таблицы, содержащие, по нашему хотению, данные ограниченного доступа. Если при обращении к таблице мы обратимся к этим столбцам, значений в них не увидим. Пример: