原文地址:http://blog.itpub.net/4227/viewspace-69049/
今天晚上升級,有個存儲過程死活編譯不過去,提示權限不足,但是用戶是具有dba權限的,網上一查才知道,oracle存儲過程分兩種,DR(Definer's Rights ) Procedure和IR(Invoker's Rights ) Procedure。
1、定義者權限:定義者權限PL/SQL程序單元是以這個程序單元擁有者的特權來執行它的,也就是說,任何具有這個PL/SQL程序單元執行權的用戶都可以訪問程序中的對象。所有具有執行權的用戶都有相同的訪問權限,在定義者權限下,執行的用戶操作的schema為定義者,所操作的對象是定義者在編譯時指定的對象。在定義者(definer)權限下,當前用戶的權限為角色無效情況下所擁有的權限。
2、調用者權限:調用者權限是指當前用戶(而不是程序的創建者)執行PL/SQL程序體的權限。這意味着不同的用戶對於某個對象具有的權限很可能是不同的,這個思想的提出,解決了不同用戶更新不同表的方法。在調用者權限下,執行的用戶操作的schema為當前用戶,所操作的對象是當前模式下的對象。在調用者(invoker)權限下,當前用戶的權限為當前所擁有的權限(含角色)。
3、ORACLE默認為定義者權限,定義者權限在存儲過程中ROLE無效,需要顯示授權,例如在存儲過程中調用其他用戶的表,但是定義存儲過程的當前用戶沒有顯示訪問該表的權限,即使當前用戶具有dba角色,編譯過程中也會出現權限不足的問題,因為role無效。
定義存儲過程時,通過指定AUTHID 屬性,定義DR Procedure 和IR Procedure
定義存儲過程時,通過指定AUTHID 屬性,定義DR Procedure 和IR Procedure
DR Procedure
1、定 義
CREATE OR REPLACE procedure DEMO(ID in NUMBER) AUTHID DEFINER as
...
BEGIN
...
END DEMO;
IR Procedure
1、定 義
CREATE OR REPLACE procedure DEMO(ID in NUMBER) AUTHID CURRENT_USER as
...
BEGIN
...
END DEMO;