我們知道,用戶擁有的role權限在存儲過程是不可用的。如: sql> select * from dba_role_privs where grantee='suk';
grantee granted_role admin_option default_role
------------ ------------
suk dba no yes
suk connect no yes
suk resource no yes
用戶suk擁有dba這個role
再創建一個測試存儲過程:
create or replace procedure p_create_table
is
begin
execute immediate 'create table create_table(id int)';
end p_create_table;然后測試
sql> exec p_create_table;
begin p_create_table; end;
ora-01031: 權限不足
ora-06512: 在"suk.p_create_table", line 3
ora-06512: 在line 1可以看到,即使擁有dba role,也不能創建表。role在存儲過程中不可用。
遇到這種情況,我們一般需要顯式進行系統權限,如grant create table to suk;
但這種方法太麻煩,有時候可能需要進行非常多的授權才能執行存儲過程
實際上,oracle給我們提供了在存儲過程中使用role權限的方法:
修改存儲過程,加入authid current_user時存儲過程可以使用role權限。
create or replace procedure p_create_table
authid current_user is
begin
execute immediate 'create table create_table(id int)';
end p_create_table;再嘗試執行:
sql> exec p_create_table;
pl/sql procedure successfully completed已經可以執行了。
新聞熱點
疑難解答