您好,登錄后才能下訂單哦!
紅色字體為關鍵 使用戶可以使用權限執行execute
我們知道,用戶擁有的role權限在存儲過程是不可用的。遇到這種情況,我們一般需要顯式進行系統權限,如grant create table to suk;但這種方法太麻煩,有時候可能需要進行非常多的授權才能執行存儲過程,實際上,oracle給我們提供了在存儲過程中使用role權限的方法:修改存儲過程,加入Authid Current_User時存儲過程可以使用role權限。
我們知道,用戶擁有的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
已經可以執行了。
==================================================================================
存儲過程默認是用定義者definer 的身份調用的,如果加上AUTHID
CURRENT_USER,則用當前登陸的用戶權限調用,如果該過程的調用者(而非定義者)被授與系統權限execute any
procedure或是被該過程的定義者grant execute on授權的話,不用這個AUTHID
CURRENT_USER子句,調用者照樣可以使用這個過程。
另外,在Oracle的存儲過程中,如果涉及到操作不同schema下的對象的時候,可以在不同的schema下寫相同的procedure,但這樣帶來的問題是維護和同步帶來了麻煩,可以在procedure中加上authid
current_user,來說明procedure中操作的對象是當前連接用戶的對象而并不是procedure所屬用戶下的對象。
-- USER01
USER01@HUIYI>create table t
2 (
3 col1
varchar2(10)
4 )
5 /
Table created.
USER01@HUIYI>insert into t values(user);
1 row created.
USER01@HUIYI>commit;
Commit complete.
USER01@HUIYI>select * from t;
COL1
--------------------
USER01
-- USER02
USER02@HUIYI>create table t
2 (
3 col1
varchar2(10)
4 )
5 /
Table created.
USER02@HUIYI>insert into t values(user);
1 row created.
USER02@HUIYI>commit;
Commit complete.
USER02@HUIYI>select * from t;
COL1
--------------------
USER02
USER02@HUIYI>create or replace procedure pro_01
2
is
3 l_col1 varchar2(10);
4 begin
5
select col1 into l_col1 from t;
6
dbms_output.put_line(l_col1);
7 end;
8 /
Procedure created.
USER02@HUIYI>create or replace procedure
pro_02
2 authid current_user
3 is
4
l_col1 varchar2(10);
5 begin
6 select col1 into l_col1
from t;
7 dbms_output.put_line(l_col1);
8 end;
9
/
Procedure created.
USER02@HUIYI>grant all on pro_01 to public;
Grant succeeded.
USER02@HUIYI>grant all on pro_02 to public;
Grant succeeded.
USER02@HUIYI>call pro_01();
USER02
Call completed.
USER02@HUIYI>call pro_02();
USER02
Call completed.
-- USER01
USER01@HUIYI>select * from t;
COL1
--------------------
USER01
USER01@HUIYI>call user02.pro_01();
USER02
Call completed.
USER01@HUIYI>call user02.pro_02();
USER01
Call completed.
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。