紅色字體為關(guān)鍵 使用戶可以使用權(quán)限執(zhí)行execute
巨野網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,巨野網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為巨野上千余家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的巨野做網(wǎng)站的公司定做!
我們知道,用戶擁有的role權(quán)限在存儲過程是不可用的。遇到這種情況,我們一般需要顯式進行系統(tǒng)權(quán)限,如grant create table to suk;但這種方法太麻煩,有時候可能需要進行非常多的授權(quán)才能執(zhí)行存儲過程,實際上,oracle給我們提供了在存儲過程中使用role權(quán)限的方法:修改存儲過程,加入Authid Current_User時存儲過程可以使用role權(quán)限。
我們知道,用戶擁有的role權(quán)限在存儲過程是不可用的。如:
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
再創(chuàng)建一個測試存儲過程:
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: 權(quán)限不足
ORA-06512:
在"SUK.P_CREATE_TABLE", line 3
ORA-06512: 在line
1
可以看到,即使擁有DBA role,也不能創(chuàng)建表。role在存儲過程中不可用。遇到這種情況,我們一般需要顯式進行系統(tǒng)權(quán)限,如grant create table to suk;
但這種方法太麻煩,有時候可能需要進行非常多的授權(quán)才能執(zhí)行存儲過程。實際上,oracle給我們提供了在存儲過程中使用role權(quán)限的方法:
修改存儲過程,加入Authid Current_User時存儲過程可以使用role權(quán)限。
create or replace procedure
p_create_table
Authid Current_User
is
begin
Execute Immediate 'create
table create_table(id int)';
end p_create_table;
再嘗試執(zhí)行:
SQL> exec p_create_table;
PL/SQL procedure successfully completed
已經(jīng)可以執(zhí)行了。
==================================================================================
存儲過程默認是用定義者definer 的身份調(diào)用的,如果加上AUTHID
CURRENT_USER,則用當前登陸的用戶權(quán)限調(diào)用,如果該過程的調(diào)用者(而非定義者)被授與系統(tǒng)權(quán)限execute any
procedure或是被該過程的定義者grant execute on授權(quán)的話,不用這個AUTHID
CURRENT_USER子句,調(diào)用者照樣可以使用這個過程。
另外,在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.