這篇文章給大家分享的是有關(guān)Oracle中定義者權(quán)限和調(diào)用者權(quán)限的示例分析的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比玉溪網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式玉溪網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋玉溪地區(qū)。費(fèi)用合理售后完善,十多年實(shí)體公司更值得信賴。
定義者權(quán)限:定義者權(quán)限指使用它所有者的權(quán)限,而不是當(dāng)前用戶來(lái)執(zhí)行過(guò)程。因此,你可以限制用戶執(zhí)行的數(shù)據(jù)庫(kù)操作,允許他們僅通過(guò)運(yùn)行定義者權(quán)限的過(guò)程和函數(shù)訪問(wèn)數(shù)據(jù)。創(chuàng)建過(guò)程、函數(shù)和程序包的默認(rèn)權(quán)限是定義者權(quán)限。
調(diào)用者權(quán)限:在當(dāng)前的用戶模式下用當(dāng)前的用戶權(quán)限來(lái)執(zhí)行過(guò)程。換句話說(shuō),就是調(diào)用者的權(quán)限過(guò)程并不與某個(gè)特定的用戶或模式綁定。調(diào)用者權(quán)限程序可以使應(yīng)用程序開(kāi)發(fā)人員很容易的將應(yīng)用邏輯集中起來(lái),即使底層的數(shù)據(jù)在用戶和模式中被劃分。創(chuàng)建時(shí)需要顯式使用AUTHID CURRENT_USER來(lái)定義調(diào)用者過(guò)程。
(注意:在閱讀下面案例的時(shí)候注意sqlplus的使用的不同用戶)
具體演示如下所示:
1、創(chuàng)建兩個(gè)測(cè)試用戶wjq1和wjq2,并分別授權(quán)
SYS@seiang11g>create user wjq1 identified by wjq1 default tablespace seiang;
User created.
SYS@seiang11g>create user wjq2 identified by wjq2 default tablespace seiang;
User created.
SYS@seiang11g>grant connect,resource to wjq1,wjq2;
Grant succeeded.
2、切換到用戶wjq1,創(chuàng)建兩個(gè)過(guò)程proc_definer和proc_invoker
過(guò)程1:定義者權(quán)限,為創(chuàng)建過(guò)程的默認(rèn)權(quán)限
WJQ1@seiang11g>create or replace procedure proc_definer is
2 begin
3 dbms_output.put_line('Current User:'|| sys_context('userenv','current_user'));
4 dbms_output.put_line('Session User:'|| sys_context('userenv','session_user'));
5 dbms_output.put_line('Current Schema:'|| sys_context('userenv','current_schema'));
6 end proc_definer;
7 /
Procedure created.
過(guò)程2:使用使用者權(quán)限
WJQ1@seiang11g>create or replace procedure proc_invoker authid current_user is
2 begin
3 dbms_output.put_line('Current User:'|| sys_context('userenv','current_user'));
4 dbms_output.put_line('Session User:'|| sys_context('userenv','session_user'));
5 dbms_output.put_line('Current Schema:'|| sys_context('userenv','current_schema'));
6 end proc_invoker;
7 /
Procedure created.
3、查看兩個(gè)過(guò)程的權(quán)限
WJQ1@seiang11g>select object_name,procedure_name,authid from user_procedures
2 where object_name like '%PROC%';
OBJECT_NAME PROCEDURE_NAME AUTHID
------------------------------ ------------------------------ ------------
PROC_INVOKER CURRENT_USER
PROC_DEFINER DEFINER
4、在用戶wjq1下分別執(zhí)行定義者權(quán)限和使用者權(quán)限的過(guò)程
WJQ1@seiang11g>set serveroutput on
WJQ1@seiang11g>
WJQ1@seiang11g>exec proc_definer;
Current User:WJQ1
Session User:WJQ1
Current Schema:WJQ1
PL/SQL procedure successfully completed.
WJQ1@seiang11g>exec proc_invoker;
Current User:WJQ1
Session User:WJQ1
Current Schema:WJQ1
PL/SQL procedure successfully completed.
5、將用戶wjq1創(chuàng)建的兩個(gè)過(guò)程授權(quán)給用戶wjq2
WJQ1@seiang11g>grant execute on proc_definer to wjq2;
Grant succeeded.
WJQ1@seiang11g>grant execute on proc_invoker to wjq2;
Grant succeeded.
6、在用戶wjq2下分別調(diào)用兩個(gè)過(guò)程,結(jié)果顯示在調(diào)用者權(quán)限下,程序在當(dāng)前用戶下用當(dāng)前用戶的權(quán)限執(zhí)行
WJQ2@seiang11g>set serveroutput on
WJQ2@seiang11g>exec wjq1.proc_definer;
Current User:WJQ1
Session User:WJQ2
Current Schema:WJQ1
PL/SQL procedure successfully completed.
WJQ2@seiang11g>exec wjq1.proc_invoker;
Current User:WJQ2
Session User:WJQ2
Current Schema:WJQ2
PL/SQL procedure successfully completed.
通過(guò)上面的簡(jiǎn)單的演示,已經(jīng)對(duì)定義者權(quán)限和調(diào)用者權(quán)限有了一定的認(rèn)識(shí)和理解,但是僅僅初步的了解在生產(chǎn)環(huán)境中,遇到實(shí)際的案例還是有點(diǎn)摸不著頭腦,下面通過(guò)兩個(gè)實(shí)際的案例來(lái)分析定義者權(quán)限和調(diào)用者權(quán)限,更加深入的去理解它們的使用方法。
在存儲(chǔ)過(guò)程中,時(shí)常會(huì)遇到這樣一種場(chǎng)景:用戶A下有一個(gè)存儲(chǔ)過(guò)程(或者函數(shù)體、包體)Proc,在過(guò)程中間引用了對(duì)象obj。在編譯存儲(chǔ)過(guò)程時(shí),是要求用戶A有對(duì)象obj的權(quán)限的,如果沒(méi)有,則系統(tǒng)報(bào)編譯錯(cuò)誤。當(dāng)成功進(jìn)行編譯之后,用戶A將執(zhí)行execute存儲(chǔ)過(guò)程Proc的權(quán)限賦給了用戶B。但是用戶B不一定擁有對(duì)象obj的使用權(quán)限,那么問(wèn)題就來(lái)了,此時(shí)用戶B能否成功執(zhí)行存儲(chǔ)過(guò)程Proc呢?
下面我們通過(guò)實(shí)驗(yàn)來(lái)進(jìn)行驗(yàn)證:
接著上面例子,用戶wjq1和wjq2除了擁有connect和resource角色的權(quán)限之外,出于實(shí)驗(yàn)的目的,我們將select any dictionary的系統(tǒng)權(quán)限賦予給用戶wjq1
SYS@seiang11g>grant select any dictionary to wjq1;
Grant succeeded.
select any dictionary的系統(tǒng)權(quán)限意味著用戶可以訪問(wèn)數(shù)據(jù)字典視圖層面的視圖中的對(duì)象數(shù)據(jù)。
WJQ1@seiang11g>select count(*) from dba_objects;
COUNT(*)
----------
86993
WJQ1@seiang11g>create or replace procedure proc_wjq1 is
2 i number;
3 begin
4 select count(*) into i from dba_objects;
5 dbms_output.put_line(to_char(i));
6 end;
7 /
Procedure created.
WJQ1@seiang11g>set serveroutput on
WJQ1@seiang11g>
WJQ1@seiang11g>exec proc_wjq1;
86994
PL/SQL procedure successfully completed.
由上可見(jiàn):授予select any dictionary的用戶wjq1可以對(duì)dba_objects視圖進(jìn)行訪問(wèn)操作。同時(shí),存儲(chǔ)過(guò)程proc_wjq1也可以執(zhí)行編譯操作。
案例一:定義者權(quán)限
緊接著上面的實(shí)驗(yàn),對(duì)于wjq2用戶,只有執(zhí)行wjq1用戶下proc_wjq1存儲(chǔ)過(guò)程權(quán)限,但是沒(méi)有訪問(wèn)dba_objects視圖權(quán)限,看實(shí)際效果。
用戶wjq2只具有基本的connect和resource權(quán)限。將proc_wjq1過(guò)程的執(zhí)行權(quán)限授權(quán)給wjq2
WJQ1@seiang11g>grant execute on proc_wjq1 to wjq2;
Grant succeeded.
之后,檢查wjq2用戶下,過(guò)程proc_wjq1的執(zhí)行情況
WJQ2@seiang11g>select count(*) from dba_objects;
select count(*) from dba_objects
*
ERROR at line 1:
ORA-00942: table or view does not exist
wjq2用戶沒(méi)有dba_objects權(quán)限,顯示訪問(wèn)必然報(bào)錯(cuò)
WJQ2@seiang11g>exec wjq1.proc_wjq1;
86994
PL/SQL procedure successfully completed.
結(jié)果顯而易見(jiàn),wjq2雖然沒(méi)有訪問(wèn)dba_objects權(quán)限,但是因?yàn)閾碛袌?zhí)行proc_wjq1的權(quán)限,在執(zhí)行proc_wjq1的時(shí)候,也是可以在方法中訪問(wèn)到dba_objects。顯然,此時(shí)wjq2在執(zhí)行proc_wjq1上應(yīng)用了wjq1用戶對(duì)于dba_objects的權(quán)限,也就是對(duì)象定義者的權(quán)限。
為了進(jìn)一步證明結(jié)果的準(zhǔn)確性,下面將繼續(xù)進(jìn)行實(shí)驗(yàn)變化來(lái)演示
當(dāng)定義者權(quán)限失去時(shí),即使調(diào)用者擁有權(quán)限也是無(wú)用的(也就是說(shuō)wjq1用戶沒(méi)有訪問(wèn)dba_objects的權(quán)限,wjq2用戶有訪問(wèn)dba_objects的權(quán)限)
回收了wjq1用戶上的select any dictionary權(quán)限,此時(shí)wjq1對(duì)dba_objects對(duì)象權(quán)限消失;然后,賦予wjq2用戶select any dictionary權(quán)限,這樣wjq2就能訪問(wèn)dba_objects了
SYS@seiang11g>revoke select any dictionary from wjq1;
Revoke succeeded.
WJQ1@seiang11g>select count(*) from dba_objects;
select count(*) from dba_objects
*
ERROR at line 1:
ORA-00942: table or view does not exist
SYS@seiang11g>
SYS@seiang11g>grant select any dictionary to wjq2;
Grant succeeded.
WJQ2@seiang11g>select count(*) from dba_objects;
COUNT(*)
----------
86994
WJQ2@seiang11g>exec wjq1.proc_wjq1;
BEGIN wjq1.proc_wjq1; END;
*
ERROR at line 1:
ORA-06550: line 1, column 12:
PLS-00905: object WJQ1.PROC_WJQ1 is invalid
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
通過(guò)上面的實(shí)驗(yàn)結(jié)果發(fā)現(xiàn):wjq2用戶擁有dba_objects對(duì)象訪問(wèn)權(quán)限,同時(shí)也有執(zhí)行proc_wjq1的權(quán)限,但是執(zhí)行的時(shí)候卻報(bào)錯(cuò),認(rèn)為對(duì)象無(wú)效。這是為什么呢?唯一的原因就是因?yàn)閣jq1用戶失去了dba_objects對(duì)象的權(quán)限,而wjq2在調(diào)用proc_wjq1時(shí)使用的是dba_objects的權(quán)限。
以上案例一的實(shí)驗(yàn)介紹了Oracle在存儲(chǔ)過(guò)程中使用的權(quán)限配置的“定義者權(quán)限”。簡(jiǎn)單的說(shuō),當(dāng)執(zhí)行一個(gè)程序體(存儲(chǔ)過(guò)程、函數(shù)和包等)的時(shí)候,方法體內(nèi)部使用的權(quán)限體系為當(dāng)前該程序體定義者的權(quán)限體系,而與調(diào)用方法的用戶無(wú)關(guān)。存儲(chǔ)過(guò)程proc_wjq1無(wú)論是哪一個(gè)用戶執(zhí)行,權(quán)限體系都是該存儲(chǔ)過(guò)程的定義者wjq1的權(quán)限。
定義者權(quán)限是Oracle使用的默認(rèn)權(quán)限選擇方式,在使用的時(shí)候很方便。調(diào)用者只要擁有簡(jiǎn)單的對(duì)象執(zhí)行權(quán)限就可以了,無(wú)需顧及自己是否擁有權(quán)限訪問(wèn)方法中使用的對(duì)象。
案例一對(duì)定義者權(quán)限通過(guò)實(shí)驗(yàn)進(jìn)行了分析,調(diào)用者權(quán)限的含義就相對(duì)容易理解了。調(diào)用者權(quán)限體系就是執(zhí)行方法體的時(shí)候,使用的權(quán)限按照調(diào)用者權(quán)限體系來(lái)判斷。一個(gè)方法的執(zhí)行,調(diào)用者除了要擁有執(zhí)行該方法的權(quán)限,還要擁有該方法中使用對(duì)象的權(quán)限才可以。
下面案例二通過(guò)實(shí)驗(yàn)對(duì)調(diào)用者權(quán)限作出詳細(xì)的分析:
案例二:調(diào)用者權(quán)限
接著上面案例一的實(shí)驗(yàn)環(huán)境。注意,此時(shí)wjq1用戶沒(méi)有select any dictionary權(quán)限,而wjq2有。
WJQ1@seiang11g>create or replace procedure proc_wjq1_1 is
2 i number;
3 begin
4 select count(*) into i from dba_objects;
5 dbms_output.put_line(to_char(i));
6 end;
7 /
Warning: Procedure created with compilation errors.
WJQ1@seiang11g>
WJQ1@seiang11g>select name,line,text from user_errors;
NAME LINE TEXT
--------------- ---------- --------------------------------------------------
PROC_WJQ1_1 4 PL/SQL: ORA-00942: table or view does not exist
PROC_WJQ1_1 4 PL/SQL: SQL Statement ignored
查看報(bào)錯(cuò)信息,還是因?yàn)閣jq1沒(méi)有dba_objects的權(quán)限,所以創(chuàng)建過(guò)程失敗。
此時(shí),如果在方法定義上加入authid current_user關(guān)鍵字,就可以將存儲(chǔ)過(guò)程變化為調(diào)用者權(quán)限。
WJQ1@seiang11g>create or replace procedure proc_wjq1_1 authid current_user is
2 i number;
3 begin
4 select count(*) into i from dba_objects;
5 dbms_output.put_line(to_char(i));
6 end;
7 /
Warning: Procedure created with compilation errors.
WJQ1@seiang11g>
WJQ1@seiang11g>select name,line,text from user_errors;
NAME LINE TEXT
--------------- ---------- --------------------------------------------------
PROC_WJQ1_1 4 PL/SQL: ORA-00942: table or view does not exist
PROC_WJQ1_1 4 PL/SQL: SQL Statement ignored
顯然,還在因?yàn)閣qj1用戶沒(méi)有權(quán)限訪問(wèn)dba_objects而報(bào)錯(cuò),畢竟不管是什么體系,wjq1目前是沒(méi)有對(duì)象權(quán)限的創(chuàng)建過(guò)程是不會(huì)成功的。不過(guò),為了實(shí)驗(yàn)成功,還是要讓wjq1能順利創(chuàng)建proc_wjq1_1過(guò)程。
SYS@seiang11g>grant select any dictionary to wjq1;
Grant succeeded.
WJQ1@seiang11g>create or replace procedure proc_wjq1_1 authid current_user is
2 i number;
3 begin
4 select count(*) into i from dba_objects;
5 dbms_output.put_line(to_char(i));
6 end;
7 /
Procedure created.
WJQ1@seiang11g>
WJQ1@seiang11g>grant execute on proc_wjq1_1 to wjq2;
Grant succeeded.
切換到wjq2用戶,注意此時(shí)它是擁有select any dictionary權(quán)限的。
WJQ2@seiang11g>select count(*) from dba_objects;
COUNT(*)
----------
86995
WJQ2@seiang11g>exec wjq1.proc_wjq1_1;
86995
PL/SQL procedure successfully completed.
此時(shí),wjq2執(zhí)行過(guò)程成功。因?yàn)榇藭r(shí)wjq1和wjq2都擁有select any dictionary權(quán)限,所以即使在調(diào)用者權(quán)限下,也是會(huì)成功的。此時(shí),如果收回wjq2上的權(quán)限,結(jié)果會(huì)如何呢?
SYS@seiang11g>revoke select any dictionary from wjq2;
Revoke succeeded.
WJQ2@seiang11g>select count(*) from dba_objects;
select count(*) from dba_objects
*
ERROR at line 1:
ORA-00942: table or view does not exist
WJQ2@seiang11g>exec wjq1.proc_wjq1;
BEGIN wjq1.proc_wjq1; END;
*
ERROR at line 1:
ORA-06550: line 1, column 12:
PLS-00905: object WJQ1.PROC_WJQ1 is invalid
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
此時(shí),就看出調(diào)用者權(quán)限的差異了。wjq1始終有dba_objects的權(quán)限,而wjq2在之后被回收了select any dictionary的權(quán)限。如果是定義者權(quán)限,wjq2調(diào)用proc_wjq1_1是沒(méi)有問(wèn)題的。但是此時(shí)報(bào)錯(cuò),說(shuō)明此處使用的是wjq2的調(diào)用者權(quán)限。
通過(guò)上述兩個(gè)案例,分別通過(guò)實(shí)驗(yàn)對(duì)定義者權(quán)限和使用者權(quán)限進(jìn)行了分析,想必大家已經(jīng)有了比較深刻的認(rèn)識(shí)和理解了,但是很多時(shí)候,我們都會(huì)使用存儲(chǔ)過(guò)程Procedure來(lái)實(shí)現(xiàn)一些腳本功能。通過(guò)Procedure來(lái)實(shí)現(xiàn)一些數(shù)據(jù)庫(kù)相關(guān)的維護(hù)、開(kāi)發(fā)工作,可以大大提高我們?nèi)粘9ぷ餍省O旅鏀?shù)據(jù)庫(kù)運(yùn)維過(guò)程中有這樣一種情況需要我們DBA去處理,實(shí)際的問(wèn)題這樣的:
同一個(gè)數(shù)據(jù)庫(kù)中有多個(gè)Schema的內(nèi)容相同,用于不同的測(cè)試目的。一些開(kāi)發(fā)同步任務(wù)促使編寫(xiě)一個(gè)程序來(lái)實(shí)現(xiàn)Schema內(nèi)部或者之間對(duì)象操作。從軟件版本角度看,維護(hù)一份工具腳本是最好的方法,可以避免由于修改造成的版本錯(cuò)亂現(xiàn)象。如何通過(guò)一個(gè)存儲(chǔ)過(guò)程腳本,在不同Schema下執(zhí)行效果不同就成了我們需要考慮的問(wèn)題?
將上述問(wèn)題簡(jiǎn)化如下:在Schema A里面包括一個(gè)存儲(chǔ)過(guò)程Proc,A中還有一張數(shù)據(jù)表T1。在Proc代碼中,包括了對(duì)表T1的操作內(nèi)容。而Schema B中也存在一個(gè)數(shù)據(jù)表T1,并且B擁有一個(gè)名為Proc的私有同義詞synonym指向A.Proc。問(wèn)題是如何讓Proc根據(jù)執(zhí)行的Schema的不同,訪問(wèn)不同Schema中數(shù)據(jù)表?換句話說(shuō),就是如果是Schema A調(diào)用Proc程序包,操作的就是Schema A里面的數(shù)據(jù)表T1。如果B調(diào)用Proc程序包,就操作Schema B里面的數(shù)據(jù)表T1。
為了對(duì)上述問(wèn)題有一個(gè)明確的處理方法,下面通過(guò)以下示例進(jìn)行模擬實(shí)驗(yàn):
SYS@seiang11g>select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE 11.2.0.4.0 Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production
SYS@seiang11g>create user wjq1 identified by wjq1 default tablespace seiang;
User created.
SYS@seiang11g>create user wjq2 identified by wjq2 default tablespace seiang;
User created.
SYS@seiang11g>grant connect,resource,create procedure,create synonym to wjq1,wjq2;
Grant succeeded.
SYS@seiang11g>select * from dba_sys_privs where grantee in ('WJQ1','WJQ2');
GRANTEE PRIVILEGE ADM
------------------------------ ---------------------------------------- ---
WJQ1 CREATE SYNONYM NO
WJQ2 UNLIMITED TABLESPACE NO
WJQ2 CREATE SYNONYM NO
WJQ1 UNLIMITED TABLESPACE NO
WJQ2 CREATE PROCEDURE NO
WJQ1 CREATE PROCEDURE NO
6 rows selected.
在Schema wjq1下面創(chuàng)建數(shù)據(jù)表和相應(yīng)的存儲(chǔ)過(guò)程。
WJQ1@seiang11g>create table tab_wjq(name varchar2(20));
Table created.
WJQ1@seiang11g>create or replace procedure proc_wjq1(v_name varchar2) is
2 begin
3 insert into tab_wjq values(v_name);
4 commit;
5 end proc_wjq1;
6 /
Procedure created.
Schema wjq1進(jìn)行執(zhí)行存儲(chǔ)過(guò)程
WJQ1@seiang11g>exec proc_wjq1('wjq');
PL/SQL procedure successfully completed.
WJQ1@seiang11g>select * from tab_wjq;
NAME
--------------------
wjq
將過(guò)程proc_wjq1的權(quán)限賦予Schema wjq2
WJQ1@seiang11g>grant execute on proc_wjq1 to wjq2;
Grant succeeded.
另外創(chuàng)建Schema wjq2數(shù)據(jù)表對(duì)象,并且包括同義詞對(duì)象。
WJQ2@seiang11g>create table tab_wjq(name varchar2(20));
Table created.
WJQ2@seiang11g>create synonym proc_wjq1 for wjq1.proc_wjq1;
Synonym created.
WJQ2@seiang11g>select * from user_synonyms;
SYNONYM_NAME TABLE_OWNER TABLE_NAME DB_LINK
--------------- --------------- -------------------- ------------------------------
PROC_WJQ1 WJQ1 PROC_WJQ1
進(jìn)行默認(rèn)情況測(cè)試,在Schema wjq2中調(diào)用存儲(chǔ)過(guò)程proc_wjq1,查看操作的是哪一個(gè)Schema下的數(shù)據(jù)表
WJQ2@seiang11g>exec proc_wjq1('seiang');
PL/SQL procedure successfully completed.
WJQ2@seiang11g>select * from tab_wjq;
no rows selected
Schema wjq2中數(shù)據(jù)表tab_wjq沒(méi)有數(shù)據(jù),查看Schema wjq1中數(shù)據(jù)表情況:
WJQ1@seiang11g>select * from tab_wjq;
NAME
--------------------
wjq
seiang
上述實(shí)驗(yàn)說(shuō)明:在默認(rèn)情況下,不同Schema對(duì)象調(diào)用相同存儲(chǔ)過(guò)程,其中涉及到的對(duì)象都是相同的。也就是Oracle存儲(chǔ)過(guò)程中的“定義者權(quán)限”。一旦用戶擁有執(zhí)行存儲(chǔ)過(guò)程的權(quán)限,就意味著在執(zhí)行體中,使用的是定義者的權(quán)限體系。
那么這個(gè)問(wèn)題似乎是沒(méi)有辦法。執(zhí)行體指向的是Schema wjq1的數(shù)據(jù)表tab_wjq。
與定義者權(quán)限對(duì)應(yīng)的就是“調(diào)用者權(quán)限”。也就說(shuō),對(duì)用戶是否可以執(zhí)行該程序體中的對(duì)象,完全取決于執(zhí)行調(diào)用用戶系統(tǒng)權(quán)限和對(duì)象權(quán)限(注意:非角色權(quán)限)。大膽的猜想,如果使用調(diào)用者權(quán)限,從執(zhí)行用戶權(quán)限角度看,是不是可以直接訪問(wèn)自己Schema中的對(duì)象了?下面通過(guò)實(shí)驗(yàn)進(jìn)行驗(yàn)證:
WJQ1@seiang11g>create or replace procedure proc_wjq1(v_name varchar2) authid current_user is
2 begin
3 insert into tab_wjq values(v_name);
4 commit;
5 end proc_wjq1;
6 /
Procedure created.
在用戶wjq1中進(jìn)行實(shí)驗(yàn),結(jié)果:
WJQ1@seiang11g>exec proc_wjq1('wjqbest');
PL/SQL procedure successfully completed.
WJQ1@seiang11g>select * from tab_wjq;
NAME
--------------------
wjq
seiang
wjqbest
轉(zhuǎn)換到用戶wjq2中,進(jìn)行實(shí)驗(yàn):
WJQ2@seiang11g>exec proc_wjq1('seiangbest');
PL/SQL procedure successfully completed.
WJQ2@seiang11g>select * from tab_wjq;
NAME
--------------------
seiangbest
從上面的實(shí)驗(yàn)結(jié)果可以發(fā)現(xiàn):在調(diào)用者權(quán)限模式下,可以實(shí)現(xiàn)調(diào)用Schema下數(shù)據(jù)表優(yōu)先的效果。如果此時(shí)Schema wjq2中沒(méi)有數(shù)據(jù)表tab_wjq,結(jié)果又會(huì)如何呢?
WJQ2@seiang11g>drop table tab_wjq;
Table dropped.
WJQ2@seiang11g>exec proc_wjq1('hahaha');
BEGIN proc_wjq1('hahaha'); END;
*
ERROR at line 1:
ORA-00942: table or view does not exist
ORA-06512: at "WJQ1.PROC_WJQ1", line 3
ORA-06512: at line 1
如果wjq2用戶擁有wjq1用戶下的數(shù)據(jù)表tab_wjq的權(quán)限,結(jié)果又會(huì)如何呢?
WJQ1@seiang11g>grant all on tab_wjq to wjq2;
Grant succeeded.
WJQ2@seiang11g>select * from wjq1.tab_wjq;
NAME
--------------------
wjq
seiang
wjqbest
WJQ2@seiang11g>exec proc_wjq1('hahaha');
BEGIN proc_wjq1('hahaha'); END;
*
ERROR at line 1:
ORA-00942: table or view does not exist
ORA-06512: at "WJQ1.PROC_WJQ1", line 3
ORA-06512: at line 1
從上面的結(jié)果發(fā)現(xiàn),即使wjq2擁有wjq1下數(shù)據(jù)表tab_wjq的權(quán)限,在使用調(diào)用者權(quán)限時(shí),也是只能操作自己Schema下的對(duì)象。所以定義者權(quán)限和調(diào)用者權(quán)限,是Oracle存儲(chǔ)過(guò)程中兩個(gè)重要的概念對(duì)象,一些麻煩場(chǎng)景下應(yīng)用往往有不錯(cuò)的效果。
感謝各位的閱讀!關(guān)于“Oracle中定義者權(quán)限和調(diào)用者權(quán)限的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
分享文章:Oracle中定義者權(quán)限和調(diào)用者權(quán)限的示例分析
URL地址:http://www.chinadenli.net/article48/joejep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、微信小程序、營(yíng)銷型網(wǎng)站建設(shè)、服務(wù)器托管、網(wǎng)站營(yíng)銷、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
移動(dòng)網(wǎng)站建設(shè)知識(shí)