Влияет ли изменение или повторное создание таблицы в Oracle на политики, определенные для нее - PullRequest
2 голосов
/ 19 августа 2010

Если у меня есть таблица и определенная политика, нужно ли мне переопределять политику, если я удаляю и воссоздаю таблицу или изменяю ее, при условии, что изменение или воссоздание таблицы не изменяет элементы, которые выполняет функциянужно видеть?

1 Ответ

1 голос
/ 19 августа 2010

"нужно ли переопределять политику, если я отбрасываю и воссоздаю таблицу"

Да.Давайте создадим политику.

SQL> exec dbms_rls.add_policy('APC', 'T23', 'DEPTPOL', 'APC', 'security_policies.get_deptno_predicate')

PL/SQL procedure successfully completed.

SQL> select count(*) from user_policies;

  COUNT(*)
----------
         1

SQL> exec security_policies.set_deptno(20)

PL/SQL procedure successfully completed.

SQL> select count(*) from t23;

  COUNT(*)
----------
         6

SQL>  

, чтобы она работала.Но если мы отбросим и заново создадим таблицу (используя резервную копию, которую я подготовил ранее) ...

SQL> drop table t23
  2  /

Table dropped.

SQL> create table t23 as select * from t23a
  2  /

Table created.

SQL> select count(*) from t23;

  COUNT(*)
----------
        11

SQL> exec security_policies.set_deptno(20)

PL/SQL procedure successfully completed.

SQL> select count(*) from t23;

  COUNT(*)
----------
        11

SQL> SQL> select count(*) from user_policies;

  COUNT(*)
----------
         0

SQL>  

"Таким образом, вопрос в том, должен ли я переопределить политику, даже если я не изменюсьчто-нибудь в определении. "

Нет.Если изменение не аннулирует сгенерированный предикат, изменение таблицы не удаляет политику:

SQL> exec dbms_rls.add_policy('APC', 'T23', 'DEPTPOL', 'APC', 'security_policies.get_deptno_predicate')

PL/SQL procedure successfully completed.

SQL> alter table t23 modify deptno number(3,0)
  2
SQL> desc t23
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 NAME                                               VARCHAR2(12 CHAR)
 ID                                                 NUMBER
 AGE                                                NUMBER(4)
 DEPTNO                                             NUMBER(2)

SQL> alter table t23 modify deptno number(3,0)
  2  /

Table altered.

SQL> exec security_policies.set_deptno(20)

PL/SQL procedure successfully completed.

SQL> select count(*) from t23;

  COUNT(*)
----------
         6

SQL> 

Обратите внимание, что изменение изменило столбец, который проверяется предикатом, и политика все еще остается в силе.


"оператор 'CREATE OR REPLACE VIEW' удаляет и воссоздает его или изменяет его?"

Давайте попробуем:

SQL> create view v23 as select * from t23;

View created.

SQL> exec dbms_rls.add_policy('APC', 'V23', 'DEPTPOLV', 'APC', 'security_policies.get_deptno_predicate')

PL/SQL procedure successfully completed.

SQL> exec security_policies.set_deptno(10)

PL/SQL procedure successfully completed.

SQL> select count(*) from v23;

  COUNT(*)
----------
         5

SQL> create or replace view v23 as select name, age from t23;

View created.

SQL> select count(*) from v23;
select count(*) from v23
                     *
ERROR at line 1:
ORA-28113: policy predicate has error


SQL>

Хорошо, это ошибка, потому что новая проекция представления не включает столбец в предикат.Но это говорит о том, что плойцы все еще на месте.Итак, давайте исправим эту ошибку:

SQL> create or replace view v23 as select name, age, deptno from t23;

View created.

SQL> select count(*) from v23;

  COUNT(*)
----------
         5

SQL>
...