中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

oracle中執行execute的時候權限不足的解決辦法

發布時間:2020-08-10 23:51:49 來源:ITPUB博客 閱讀:587 作者:hadba 欄目:關系型數據庫
create or replace procedure p_create_table
   Authid Current_User is
    begin
    Execute Immediate 'create table create_table(id int)';
    end p_create_table;

紅色字體為關鍵  使用戶可以使用權限執行execute

 

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

我們知道,用戶擁有的role權限在存儲過程是不可用的。如:

    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

再創建一個測試存儲過程:

    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: 權限不足
    ORA-06512: 在"SUK.P_CREATE_TABLE", line 3
    ORA-06512: 在line 1
 

 

 

可以看到,即使擁有DBA role,也不能創建表。role在存儲過程中不可用。遇到這種情況,我們一般需要顯式進行系統權限,如grant create table to suk;


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

修改存儲過程,加入Authid Current_User時存儲過程可以使用role權限。

    create or replace procedure p_create_table
    Authid Current_User is
    begin
    Execute Immediate 'create table create_table(id int)';
    end p_create_table;


再嘗試執行:

    SQL> exec p_create_table;

    PL/SQL procedure successfully completed
 

已經可以執行了。

 

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

存儲過程默認是用定義者definer 的身份調用的,如果加上AUTHID CURRENT_USER,則用當前登陸的用戶權限調用,如果該過程的調用者(而非定義者)被授與系統權限execute any procedure或是被該過程的定義者grant execute on授權的話,不用這個AUTHID CURRENT_USER子句,調用者照樣可以使用這個過程。
另外,在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.

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

三穗县| 五台县| 介休市| 淄博市| 乡城县| 新野县| 长武县| 景德镇市| 崇礼县| 丘北县| 禄劝| 双鸭山市| 景洪市| 墨竹工卡县| 格尔木市| 海原县| 富宁县| 昌吉市| 梁河县| 道孚县| 茌平县| 公主岭市| 赤城县| 阿拉尔市| 离岛区| 佛冈县| 朝阳市| 丹凤县| 汝州市| 页游| 城口县| 霍山县| 女性| 金乡县| 宝应县| 伊宁市| 荆州市| 桂平市| 两当县| 兴和县| 常山县|