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

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

這篇文章給大家分享的是有關(guān)Oracle中定義者權(quán)限和調(diào)用者權(quán)限的示例分析的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比玉溪網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式玉溪網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋玉溪地區(qū)。費(fèi)用合理售后完善,十多年實(shí)體公司更值得信賴。

定義者權(quán)限:定義者權(quán)限指使用它所有者的權(quán)限,而不是當(dāng)前用戶來執(zhí)行過程。因此,你可以限制用戶執(zhí)行的數(shù)據(jù)庫操作,允許他們僅通過運(yùn)行定義者權(quán)限的過程和函數(shù)訪問數(shù)據(jù)。創(chuàng)建過程、函數(shù)和程序包的默認(rèn)權(quán)限是定義者權(quán)限。

 

調(diào)用者權(quán)限:在當(dāng)前的用戶模式下用當(dāng)前的用戶權(quán)限來執(zhí)行過程。換句話說,就是調(diào)用者的權(quán)限過程并不與某個(gè)特定的用戶或模式綁定。調(diào)用者權(quán)限程序可以使應(yīng)用程序開發(fā)人員很容易的將應(yīng)用邏輯集中起來,即使底層的數(shù)據(jù)在用戶和模式中被劃分。創(chuàng)建時(shí)需要顯式使用AUTHID CURRENT_USER來定義調(diào)用者過程。

(注意:在閱讀下面案例的時(shí)候注意sqlplus的使用的不同用戶)

具體演示如下所示:

1、創(chuàng)建兩個(gè)測試用戶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è)過程proc_definer和proc_invoker

過程1:定義者權(quán)限,為創(chuàng)建過程的默認(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.

過程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è)過程的權(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)限的過程

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è)過程授權(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è)過程,結(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.

通過上面的簡單的演示,已經(jīng)對定義者權(quán)限和調(diào)用者權(quán)限有了一定的認(rèn)識和理解,但是僅僅初步的了解在生產(chǎn)環(huán)境中,遇到實(shí)際的案例還是有點(diǎn)摸不著頭腦,下面通過兩個(gè)實(shí)際的案例來分析定義者權(quán)限和調(diào)用者權(quán)限,更加深入的去理解它們的使用方法。

在存儲過程中,時(shí)常會遇到這樣一種場景:用戶A下有一個(gè)存儲過程(或者函數(shù)體、包體)Proc,在過程中間引用了對象obj。在編譯存儲過程時(shí),是要求用戶A有對象obj的權(quán)限的,如果沒有,則系統(tǒng)報(bào)編譯錯(cuò)誤。當(dāng)成功進(jìn)行編譯之后,用戶A將執(zhí)行execute存儲過程Proc的權(quán)限賦給了用戶B。但是用戶B不一定擁有對象obj的使用權(quán)限,那么問題就來了,此時(shí)用戶B能否成功執(zhí)行存儲過程Proc呢?

下面我們通過實(shí)驗(yàn)來進(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)限意味著用戶可以訪問數(shù)據(jù)字典視圖層面的視圖中的對象數(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. 

由上可見:授予select any dictionary的用戶wjq1可以對dba_objects視圖進(jìn)行訪問操作。同時(shí),存儲過程proc_wjq1也可以執(zhí)行編譯操作。

案例一:定義者權(quán)限

緊接著上面的實(shí)驗(yàn),對于wjq2用戶,只有執(zhí)行wjq1用戶下proc_wjq1存儲過程權(quán)限,但是沒有訪問dba_objects視圖權(quán)限,看實(shí)際效果。

用戶wjq2只具有基本的connect和resource權(quán)限。將proc_wjq1過程的執(zhí)行權(quán)限授權(quán)給wjq2

WJQ1@seiang11g>grant execute on proc_wjq1 to wjq2;

Grant succeeded. 

之后,檢查wjq2用戶下,過程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用戶沒有dba_objects權(quán)限,顯示訪問必然報(bào)錯(cuò)

WJQ2@seiang11g>exec wjq1.proc_wjq1;

86994

PL/SQL procedure successfully completed.

結(jié)果顯而易見,wjq2雖然沒有訪問dba_objects權(quán)限,但是因?yàn)閾碛袌?zhí)行proc_wjq1的權(quán)限,在執(zhí)行proc_wjq1的時(shí)候,也是可以在方法中訪問到dba_objects。顯然,此時(shí)wjq2在執(zhí)行proc_wjq1上應(yīng)用了wjq1用戶對于dba_objects的權(quán)限,也就是對象定義者的權(quán)限。

為了進(jìn)一步證明結(jié)果的準(zhǔn)確性,下面將繼續(xù)進(jìn)行實(shí)驗(yàn)變化來演示

當(dāng)定義者權(quán)限失去時(shí),即使調(diào)用者擁有權(quán)限也是無用的(也就是說wjq1用戶沒有訪問dba_objects的權(quán)限,wjq2用戶有訪問dba_objects的權(quán)限)

回收了wjq1用戶上的select any dictionary權(quán)限,此時(shí)wjq1對dba_objects對象權(quán)限消失;然后,賦予wjq2用戶select any dictionary權(quán)限,這樣wjq2就能訪問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

通過上面的實(shí)驗(yàn)結(jié)果發(fā)現(xiàn):wjq2用戶擁有dba_objects對象訪問權(quán)限,同時(shí)也有執(zhí)行proc_wjq1的權(quán)限,但是執(zhí)行的時(shí)候卻報(bào)錯(cuò),認(rèn)為對象無效。這是為什么呢?唯一的原因就是因?yàn)閣jq1用戶失去了dba_objects對象的權(quán)限,而wjq2在調(diào)用proc_wjq1時(shí)使用的是dba_objects的權(quán)限。

以上案例一的實(shí)驗(yàn)介紹了Oracle在存儲過程中使用的權(quán)限配置的“定義者權(quán)限”。簡單的說,當(dāng)執(zhí)行一個(gè)程序體(存儲過程、函數(shù)和包等)的時(shí)候,方法體內(nèi)部使用的權(quán)限體系為當(dāng)前該程序體定義者的權(quán)限體系,而與調(diào)用方法的用戶無關(guān)。存儲過程proc_wjq1無論是哪一個(gè)用戶執(zhí)行,權(quán)限體系都是該存儲過程的定義者wjq1的權(quán)限。

定義者權(quán)限是Oracle使用的默認(rèn)權(quán)限選擇方式,在使用的時(shí)候很方便。調(diào)用者只要擁有簡單的對象執(zhí)行權(quán)限就可以了,無需顧及自己是否擁有權(quán)限訪問方法中使用的對象。

案例一對定義者權(quán)限通過實(shí)驗(yàn)進(jìn)行了分析,調(diào)用者權(quán)限的含義就相對容易理解了。調(diào)用者權(quán)限體系就是執(zhí)行方法體的時(shí)候,使用的權(quán)限按照調(diào)用者權(quán)限體系來判斷。一個(gè)方法的執(zhí)行,調(diào)用者除了要擁有執(zhí)行該方法的權(quán)限,還要擁有該方法中使用對象的權(quán)限才可以。

 

下面案例二通過實(shí)驗(yàn)對調(diào)用者權(quán)限作出詳細(xì)的分析:

案例二:調(diào)用者權(quán)限

接著上面案例一的實(shí)驗(yàn)環(huán)境。注意,此時(shí)wjq1用戶沒有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沒有dba_objects的權(quán)限,所以創(chuàng)建過程失敗。

此時(shí),如果在方法定義上加入authid current_user關(guān)鍵字,就可以將存儲過程變化為調(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用戶沒有權(quán)限訪問dba_objects而報(bào)錯(cuò),畢竟不管是什么體系,wjq1目前是沒有對象權(quán)限的創(chuàng)建過程是不會成功的。不過,為了實(shí)驗(yàn)成功,還是要讓wjq1能順利創(chuàng)建proc_wjq1_1過程。

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í)行過程成功。因?yàn)榇藭r(shí)wjq1和wjq2都擁有select any dictionary權(quán)限,所以即使在調(diào)用者權(quán)限下,也是會成功的。此時(shí),如果收回wjq2上的權(quán)限,結(jié)果會如何呢?

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是沒有問題的。但是此時(shí)報(bào)錯(cuò),說明此處使用的是wjq2的調(diào)用者權(quán)限。

       通過上述兩個(gè)案例,分別通過實(shí)驗(yàn)對定義者權(quán)限和使用者權(quán)限進(jìn)行了分析,想必大家已經(jīng)有了比較深刻的認(rèn)識和理解了,但是很多時(shí)候,我們都會使用存儲過程Procedure來實(shí)現(xiàn)一些腳本功能。通過Procedure來實(shí)現(xiàn)一些數(shù)據(jù)庫相關(guān)的維護(hù)、開發(fā)工作,可以大大提高我們?nèi)粘9ぷ餍?。下面?shù)據(jù)庫運(yùn)維過程中有這樣一種情況需要我們DBA去處理,實(shí)際的問題這樣的:


      同一個(gè)數(shù)據(jù)庫中有多個(gè)Schema的內(nèi)容相同,用于不同的測試目的。一些開發(fā)同步任務(wù)促使編寫一個(gè)程序來實(shí)現(xiàn)Schema內(nèi)部或者之間對象操作。從軟件版本角度看,維護(hù)一份工具腳本是最好的方法,可以避免由于修改造成的版本錯(cuò)亂現(xiàn)象。如何通過一個(gè)存儲過程腳本,在不同Schema下執(zhí)行效果不同就成了我們需要考慮的問題?


       將上述問題簡化如下:在Schema A里面包括一個(gè)存儲過程Proc,A中還有一張數(shù)據(jù)表T1。在Proc代碼中,包括了對表T1的操作內(nèi)容。而Schema B中也存在一個(gè)數(shù)據(jù)表T1,并且B擁有一個(gè)名為Proc的私有同義詞synonym指向A.Proc。問題是如何讓Proc根據(jù)執(zhí)行的Schema的不同,訪問不同Schema中數(shù)據(jù)表?換句話說,就是如果是Schema A調(diào)用Proc程序包,操作的就是Schema A里面的數(shù)據(jù)表T1。如果B調(diào)用Proc程序包,就操作Schema B里面的數(shù)據(jù)表T1。

為了對上述問題有一個(gè)明確的處理方法,下面通過以下示例進(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)的存儲過程。

 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í)行存儲過程

WJQ1@seiang11g>exec proc_wjq1('wjq');

PL/SQL procedure successfully completed.

WJQ1@seiang11g>select * from tab_wjq;

NAME

--------------------

wjq 

將過程proc_wjq1的權(quán)限賦予Schema wjq2

 WJQ1@seiang11g>grant execute on proc_wjq1 to wjq2;

Grant succeeded. 

另外創(chuàng)建Schema wjq2數(shù)據(jù)表對象,并且包括同義詞對象。

 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)情況測試,在Schema wjq2中調(diào)用存儲過程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沒有數(shù)據(jù),查看Schema wjq1中數(shù)據(jù)表情況:

WJQ1@seiang11g>select * from tab_wjq;

NAME

--------------------

wjq

seiang 

上述實(shí)驗(yàn)說明:在默認(rèn)情況下,不同Schema對象調(diào)用相同存儲過程,其中涉及到的對象都是相同的。也就是Oracle存儲過程中的“定義者權(quán)限”。一旦用戶擁有執(zhí)行存儲過程的權(quán)限,就意味著在執(zhí)行體中,使用的是定義者的權(quán)限體系。

       那么這個(gè)問題似乎是沒有辦法。執(zhí)行體指向的是Schema wjq1的數(shù)據(jù)表tab_wjq。

與定義者權(quán)限對應(yīng)的就是“調(diào)用者權(quán)限”。也就說,對用戶是否可以執(zhí)行該程序體中的對象,完全取決于執(zhí)行調(diào)用用戶系統(tǒng)權(quán)限和對象權(quán)限(注意:非角色權(quán)限)。大膽的猜想,如果使用調(diào)用者權(quán)限,從執(zhí)行用戶權(quán)限角度看,是不是可以直接訪問自己Schema中的對象了?下面通過實(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中沒有數(shù)據(jù)表tab_wjq,結(jié)果又會如何呢?

 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é)果又會如何呢?

 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下的對象。所以定義者權(quán)限和調(diào)用者權(quán)限,是Oracle存儲過程中兩個(gè)重要的概念對象,一些麻煩場景下應(yīng)用往往有不錯(cuò)的效果。

感謝各位的閱讀!關(guān)于“Oracle中定義者權(quán)限和調(diào)用者權(quán)限的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

分享文章:Oracle中定義者權(quán)限和調(diào)用者權(quán)限的示例分析
URL地址:http://chinadenli.net/article48/joejep.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、微信小程序、營銷型網(wǎng)站建設(shè)服務(wù)器托管、網(wǎng)站營銷搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)
久久本道综合色狠狠五月| 日韩精品人妻少妇一区二区| 国产又粗又黄又爽又硬的| 国产欧美日产久久婷婷| 国产精品日本女优在线观看| 中文字幕高清免费日韩视频| 国产黑人一区二区三区| 免费福利午夜在线观看| 在线播放欧美精品一区| 久久综合亚洲精品蜜桃| 一区二区三区精品人妻| 日本精品中文字幕人妻| 开心五月激情综合婷婷色| 亚洲成人黄色一级大片| 欧美激情一区=区三区| 国产精品午夜小视频观看| 日韩不卡一区二区三区色图| 五月天综合网五月天综合网| 蜜桃av人妻精品一区二区三区| 欧美亚洲另类久久久精品| 日韩人妻免费视频一专区| 欧美午夜伦理在线观看| 欧美尤物在线观看西比尔| 久久精品国产熟女精品| 大香伊蕉欧美一区二区三区| 大香蕉精品视频一区二区| 91精品视频免费播放| 国产精品久久熟女吞精| 黄色国产一区二区三区| 蜜臀人妻一区二区三区| 日本欧美一区二区三区在线播| 欧美有码黄片免费在线视频| 亚洲一级二级三级精品| 精品丝袜一区二区三区性色| 国产一区一一一区麻豆| 亚洲精品福利入口在线| 国产精品欧美激情在线观看| 国产麻豆视频一二三区| 日韩成人h视频在线观看| 日韩精品一区二区一牛| 91久久精品国产成人|