2

テーブルと定義されたポリシーがある場合、テーブルを削除して再作成するか、テーブルを変更する場合は、ポリシーを再定義する必要がありますか?ただし、テーブルの変更または再作成によって、関数が表示する必要のある要素が変更されることはありません。 ?

4

1 に答える 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 に答える