在oracle中更改或删除重新创建表是否会影响表上定义的策略

在oracle中更改或删除重新创建表是否会影响表上定义的策略,oracle,row-level-security,Oracle,Row Level Security,如果我有一个表和一个已定义的策略,那么如果我删除并重新创建表或修改它,我是否需要重新定义策略,前提是表的修改或重新创建不会改变函数需要查看的元素 “我需要重新定义政策吗 删除并重新创建表“ 对。让我们创建一个策略 SQL> exec dbms_rls.add_policy('APC', 'T23', 'DEPTPOL', 'APC', 'security_policies.get_deptno_predicate') PL/SQL procedure successfully compl

如果我有一个表和一个已定义的策略,那么如果我删除并重新创建表或修改它,我是否需要重新定义策略,前提是表的修改或重新创建不会改变函数需要查看的元素

“我需要重新定义政策吗 删除并重新创建表“

对。让我们创建一个策略

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> 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> 
请注意,更改修改了由谓词测试的列,并且策略仍然有效


“是否创建或替换视图” 语句删除并重新创建它或 它会改变它吗?”

让我们试试看:

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>

是的,我相信丢掉一张桌子会破坏所有与之相关的政策。然而,就改变而言,我不确定。您能否更具体地说明策略、表架构以及您希望更改的内容?我的一些同事更改了表上的一个视图,以便将一列定义为截止日期(B),而不是B。现在我在该视图上的策略不关心该列。它只是说“如果用户是‘USERNAME’,那么返回谓词:”where user_id=user所以它不受圣坛的影响。所以问题是,即使我不会改变定义中的任何内容,我是否必须重新定义政策。我还扩展了我的问题,因此如果发生删除创建,我必须重新创建策略。我现在无法测试它(我正在度假),也没有访问权限。所以我想知道他们是否非常感谢。最后一个细节:如果视图存在,“CREATE或REPLACE view”语句是否会删除并重新创建它,或者它是否会更改它?如果是第一个,那么我需要重新定义政策,如果是第二个,那么我猜政策仍然存在。。。我是对的?(策略是在视图上定义的,并且是通过创建或替换stm更改的视图)谢谢。如果可以的话,我会为你回答的方式给你投1000票。顺便问一下,你是怎么做的?我的意思是,你如何找到花时间解释什么时候你可以花时间去发现更多的东西的意愿?我发现自己非常渴望探索和创造,但从不解释,除非我把解释作为一种提炼知识的手段。。。这很糟糕,但我发现很难改掉这个习惯。这不是出于自私,只是每当桌上没有什么新东西时,我都会忍不住拖延……就我个人而言,我认为向别人解释一些东西是加强自己学习的好方法。其次,使用一个真实的例子(比如APC)是检查您自己的假设是否正确的好方法。正如Tom Kyte不断提醒我们的那样,我们对Oracle9的假设在10、11等版本上可能是错误的——没有什么比检查更胜于信任了。
SQL> create or replace view v23 as select name, age, deptno from t23;

View created.

SQL> select count(*) from v23;

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

SQL>