oracle中執(zhí)行execute的時(shí)候權(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;

紅色字體為關(guān)鍵  使用戶可以使用權(quán)限執(zhí)行execute

巨野網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,巨野網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為巨野上千余家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設(shè)要多少錢,請找那個(gè)售后服務(wù)好的巨野做網(wǎng)站的公司定做!

 

我們知道,用戶擁有的role權(quán)限在存儲(chǔ)過程是不可用的。遇到這種情況,我們一般需要顯式進(jìn)行系統(tǒng)權(quán)限,如grant create table to suk;但這種方法太麻煩,有時(shí)候可能需要進(jìn)行非常多的授權(quán)才能執(zhí)行存儲(chǔ)過程,實(shí)際上,oracle給我們提供了在存儲(chǔ)過程中使用role權(quán)限的方法:修改存儲(chǔ)過程,加入Authid Current_User時(shí)存儲(chǔ)過程可以使用role權(quán)限。

我們知道,用戶擁有的role權(quán)限在存儲(chǔ)過程是不可用的。如:

    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這個(gè)role

再創(chuàng)建一個(gè)測試存儲(chǔ)過程:

    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在存儲(chǔ)過程中不可用。遇到這種情況,我們一般需要顯式進(jìn)行系統(tǒng)權(quán)限,如grant create table to suk;


但這種方法太麻煩,有時(shí)候可能需要進(jìn)行非常多的授權(quán)才能執(zhí)行存儲(chǔ)過程。實(shí)際上,oracle給我們提供了在存儲(chǔ)過程中使用role權(quán)限的方法:

修改存儲(chǔ)過程,加入Authid Current_User時(shí)存儲(chǔ)過程可以使用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í)行了。

 

==================================================================================

存儲(chǔ)過程默認(rèn)是用定義者definer 的身份調(diào)用的,如果加上AUTHID CURRENT_USER,則用當(dāng)前登陸的用戶權(quán)限調(diào)用,如果該過程的調(diào)用者(而非定義者)被授與系統(tǒng)權(quán)限execute any procedure或是被該過程的定義者grant execute on授權(quán)的話,不用這個(gè)AUTHID CURRENT_USER子句,調(diào)用者照樣可以使用這個(gè)過程。
另外,在Oracle的存儲(chǔ)過程中,如果涉及到操作不同schema下的對(duì)象的時(shí)候,可以在不同的schema下寫相同的procedure,但這樣帶來的問題是維護(hù)和同步帶來了麻煩,可以在procedure中加上authid current_user,來說明procedure中操作的對(duì)象是當(dāng)前連接用戶的對(duì)象而并不是procedure所屬用戶下的對(duì)象。

-- 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.

當(dāng)前名稱:oracle中執(zhí)行execute的時(shí)候權(quán)限不足的解決辦法
網(wǎng)站網(wǎng)址:http://bm7419.com/article10/pcigdo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、品牌網(wǎng)站制作、定制網(wǎng)站商城網(wǎng)站、云服務(wù)器關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(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è)計(jì)公司