テーブルと定義されたポリシーがある場合、テーブルを削除して再作成するか、テーブルを変更する場合は、ポリシーを再定義する必要がありますか?ただし、テーブルの変更または再作成によって、関数が表示する必要のある要素が変更されることはありません。 ?
1819 次
1 に答える
1
「テーブルを削除して再作成する場合、ポリシーを再定義する必要がありますか?」
はい。ポリシーを作成しましょう。
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>
于 2010-08-19T12:09:34.343 に答える