2010-08-19 41 views
2

如果我有一個表和定義的策略,那麼是否需要重新定義策略,如果我刪除並重新創建表或更改它,提供表格的改變或重新創建不會改變函數需要看到的元素?在oracle中更改或刪除重新創建表會影響在其上定義的策略

+0

是的,我確信放棄一個表會破壞綁定到它的所有策略。但是,就變化而言,我不確定。您能否更具體地瞭解政策,表格模式以及您想要更改的內容? – XstreamINsanity 2010-08-19 11:28:10

+0

我的一些同事在表格上改變了一個視圖,所以列被定義爲to_date(B)而不是B.現在我對這個視圖的策略並不關心這個列。它只是說「如果用戶是'USERNAME',那麼返回謂詞:'where user_id = user'。所以它不會被修改。所以問題是如果我必須重新定義策略,即使我不會改變任何東西這個定義,我也擴展了我的問題,所以如果發生drop-create,我將不得不重新創建策略,現在我不能測試它(我正在度假)並且沒有任何訪問權限,所以我想知道它們是否必須 – Paralife 2010-08-19 11:41:02

回答

1

"do I need to redefine the policy if I drop and recreate the table"

是的。我們來創建一個策略。

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> 

"So the question is if I must redefine the policy even if I will not change anything in the definition."

號提供的變化並不能否定生成的謂詞策略:

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> 

請注意,更改修改了由謂詞測試的列,並且策略仍然有效。


"does a 'CREATE OR REPLACE VIEW' statement drops and recreates it or does it alter it?"

讓我們試一下:

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> 
+0

最後一個細節:如果一個視圖存在,'CREATE OR REPLACE VIEW'語句是否會刪除並重新創建它或者是否會改變它? 如果它是第一個,那麼我需要重新定義策略,如果它是那麼我想政策仍然存在......我是正確的?(政策是定義在一個視圖,這是他們通過CREATE或REPLACE STM更改的視圖) – Paralife 2010-08-19 12:19:00

+0

謝謝。如果我能我upvote你1000只是爲了你的回答。順便說一句,你怎麼做?我是ñ你如何找到花時間解釋你何時可以花費更多時間去發現的意願?我發現自己非常渴望探索和創造,但從來沒有解釋,除了當我作爲一種手段來提煉我的知識解釋......這是非常糟糕的,但我覺得很難擺脫這種習慣。這不是來自私,只是當桌子上沒有什麼新東西的時候,我不能幫助,但拖延...... – Paralife 2010-08-19 13:07:05

+0

個人而言,我認爲向其他人解釋某些東西是增強自己學習的好方法。其次,使用真實的例子(如APC)是檢查自己的假設是否正確的好方法。正如Tom Kyte不斷提醒我們的那樣,我們對Oracle 9的假設在10,11等方面可能是錯誤的 - 沒有什麼比檢查而不是信任。 – JulesLt 2010-08-19 14:11:53