91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

新乡县| 武平县| 阿勒泰市| 奇台县| 宁津县| 永吉县| 杨浦区| 鹤庆县| 新郑市| 石嘴山市| 万盛区| 定南县| 东乡族自治县| 旬邑县| 象州县| 大理市| 延津县| 化州市| 丰镇市| 乳源| 公主岭市| 澄迈县| 安溪县| 吉首市| 肥城市| 吉水县| 新沂市| 三明市| 文化| 永仁县| 定陶县| 二连浩特市| 磴口县| 南投市| 雷波县| 东阳市| 南和县| 绥江县| 南平市| 曲松县| 广东省|