呼叫者儲存過程訪問許可權問題

yangtingkun發表於2012-03-08

一直認為呼叫者許可權過程所參考的物件是呼叫者使用者下的物件,所依賴的許可權也是呼叫者擁有的許可權,但是現在發現事實並非完全如此。

 

 

事實上這個觀點對於表、檢視是正確的,呼叫者許可權儲存過程訪問的表和檢視是呼叫者當前使用者下的,且許可權都來自呼叫者本身。

但是對於儲存過程,卻是個例外,呼叫者許可權儲存過程中呼叫的OWNER使用者下的儲存過程,對於呼叫者而言,即使沒有許可權也是可以訪問的。

描述有點抽象,看一個簡單的例子:

SQL> CONN SYSTEM/MANAGER
已連線。
SQL> CREATE USER U1 IDENTIFIED BY U1 DEFAULT TABLESPACE USERS;

使用者已建立。

SQL> GRANT CREATE SESSION TO U1;

授權成功。

SQL> CONN TEST/TEST
已連線。
SQL> CREATE OR REPLACE PROCEDURE P_1 AUTHID CURRENT_USER AS
2 BEGIN
3 NULL;
4 END;
5 /

過程已建立。

SQL> CREATE OR REPLACE PROCEDURE P_2 AUTHID CURRENT_USER AS
2 BEGIN
3 P_1;
4 END;
5 /

過程已建立。

SQL> GRANT EXECUTE ON P_2 TO U1;

授權成功。

SQL> CONN U1/U1
已連線。
SQL> EXEC TEST.P_1
BEGIN TEST.P_1; END;

*
1 行出現錯誤:
ORA-06550:
1 , 7
:
PLS-00201:
必須宣告識別符號
'TEST.P_1'
ORA-06550:
1 , 7
:
PL/SQL: Statement ignored


SQL> EXEC TEST.P_2

PL/SQL 過程已成功完成。

建立一個只有CREATE SESSION許可權的使用者。在另外一個使用者下,建立兩個呼叫者許可權的儲存過程,其中P_2呼叫P_1。將儲存過程P_2的執行許可權授權給P_1。用新建立的使用者登入,可以看到,使用者沒有許可權執行P_1,但是使用者可以執行P_2,這意味著使用者透過P_2的執行許可權,呼叫了儲存過程OWNER使用者下呼叫者本沒有許可權的儲存過程P_1

這對於定義者許可權儲存過程是順理成章的,但是對於呼叫者儲存過程而言,物件的訪問許可權是在呼叫時判斷,因此由呼叫者確定訪問的物件和許可權。沒有想到,Oracle這裡的物件的範圍並不包含儲存過程。

第一個過程是否是呼叫者許可權並不重要,將其改為定義者許可權,結果依舊:

SQL> CONN TEST/TEST
已連線。
SQL> CREATE OR REPLACE PROCEDURE P_1 AS
2 BEGIN
3 NULL;
4 END;
5 /

過程已建立。

SQL> CREATE OR REPLACE PROCEDURE P_2 AUTHID CURRENT_USER AS
2 BEGIN
3 P_1;
4 END;
5 /

過程已建立。

SQL> CONN U1/U1
已連線。
SQL> EXEC TEST.P_2

PL/SQL 過程已成功完成。

 

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

相關文章