欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Oracle中定義者權(quán)限和調(diào)用者權(quán)限的示例分析

這篇文章給大家分享的是有關(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)

商城網(wǎng)站建設(shè)