呼叫者許可權過程對OWNER物件的依賴

yangtingkun發表於2010-09-23

今天在看定義者、呼叫者許可權部分想到的這個問題。

 

 

對於呼叫者許可權儲存過程,不同的使用者訪問是本使用者下的表,但是如果儲存過程的OWNER使用者下儲存過程所依賴的表被刪除,其他使用者下還能否正常執行這個過程。

做了個簡單的測試:

SQL> CONN YANGTK/YANGTK
已連線。
SQL> CREATE TABLE T (ID NUMBER);

表已建立。

SQL> CREATE OR REPLACE PROCEDURE P_TEST
  2  AUTHID CURRENT_USER
  3  AS
  4  BEGIN
  5  INSERT INTO T VALUES (1);
  6  END;
  7  /

過程已建立。

SQL> GRANT EXECUTE ON P_TEST TO TEST;

授權成功。

SQL> CONN TEST/TEST
已連線。
SQL> CREATE TABLE T (ID NUMBER);

表已建立。

SQL> EXEC YANGTK.P_TEST

PL/SQL 過程已成功完成。

SQL> SELECT * FROM T;

        ID
----------
         1

SQL> CONN YANGTK/YANGTK
已連線。
SQL> DROP TABLE T PURGE;

表已刪除。

SQL> SELECT OBJECT_NAME, OBJECT_TYPE, STATUS
  2  FROM USER_OBJECTS
  3  WHERE OBJECT_NAME = 'P_TEST';

OBJECT_NAME                    OBJECT_TYPE         STATUS
------------------------------ ------------------- -------
P_TEST                         PROCEDURE           INVALID

SQL> CONN TEST/TEST
已連線。
SQL> EXEC YANGTK.P_TEST
BEGIN YANGTK.P_TEST; END;

             *
1 行出現錯誤:
ORA-06550:
1 , 14
:
PLS-00905:
物件 YANGTK.P_TEST 無效

ORA-06550:
1 , 7 :
PL/SQL: Statement ignored

雖然TEST使用者執行YANGTK使用者下的P_TEST過程,插入的是自己使用者中的T表,但是如果儲存過程的OWNER使用者刪除了過程依賴的表,即使其他使用者下儲存過程仍然可以執行,Oracle也會將儲存過程置於INVALID狀態,而且其他使用者執行並不會導致儲存過程成功編譯,也就是說呼叫者儲存過程依賴OWNER下的物件。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-674736/,如需轉載,請註明出處,否則將追究法律責任。

相關文章