2016-06-13 54 views
0

我想從過程內向用戶授予角色。例如,我以jsmith身份登錄,並從SQL窗口登錄:在Oracle中,從過程內向用戶授予角色

EXECUTE IMMEDIATE 'grant some_role to rjones'; 

並且它成功運行。

但如果我創建這樣一個過程:

CREATE OR REPLACE PROCEDURE MY_ROLE_GRANTING_PROCEDURE 

IS 

BEGIN 

EXECUTE IMMEDIATE 'grant some_role to rjones'; 

END; 

當我跑我得到以下錯誤的程序:

ORA-01932: ADMIN option not granted for role 'some_role'

看來,我需要授予我的程序相同作爲用戶jsmith的角色授予能力,但我不知道該怎麼做。另外,我創建了程序作爲jsmith,因此對該過程的執行權限不應該成爲問題。

回答

2

默認情況下,Oracle中的過程是使用定義者的權限創建的。我記不起所有的細節,但是在定義者的權利模式中,程序以程序所有者的特權運行,程序所有者可能不是執行程序的同一用戶,甚至不一定與用戶相同創建/編譯過程。另外,我相信它忽略了程序所有者的角色。它只能訪問直接授予程序所有者的權限。

在你的情況,我認爲你想編譯使用調用者的權利程序。在這種模式下,該過程使用執行用戶的權限,我相信角色也被考慮在內。

要使用此模式,您只需要添加authid current_user到程序的聲明:

CREATE OR REPLACE PROCEDURE MY_ROLE_GRANTING_PROCEDURE authid current_user 

IS 

BEGIN 

EXECUTE IMMEDIATE 'grant some_role to rjones'; 

END; 

對於2種模式中,你可以執行程序的更好,更完整的解釋,看看這裏:Managing Security for Definer's Rights and Invoker's Rights

編輯

我還會添加一個鏈接到下面的文章,我覺得這一點更容易閱讀:Invoker Rights Part 1

+0

這解決了我的問題。謝謝,斯坦! – MrMike