oracle存儲過程訪問其它用戶表權限不足

一個oracle的存儲過程中存在一條訪問其它用戶表的select語句,總是提示沒有訪問權限,在plsql以及測試下都能執行,但是封裝成存儲過程總提示沒有訪問權限。

解決如下:

1切換到創建表的其它用戶下,執行:

GRANT SELECT ANY TABLE TO USER_A  WITH ADMIN OPTION;

user_a是創建存儲過程的那個用戶,然後重新切換到當前用戶,執行通過。

2.第一種方式並不是最佳的方式,通過查資料。知道使用存儲過程分兩種權限:

以研究一下steven的plsql程序設計,裏面專門有一節討論這個問題。

先收回上面分配的權限: revoke select ANY TABLE from spmc;

分配單個表的權限 GRANT select ON t_pub_instinfo TO spmc WITH GRANT OPTION;
使用存儲過程的時候分成兩種權限:
1.定義者權限
2.調用者權限
默認的情況下使用的是定義者權限。
定義者權限要求所有權限是直接授權的,通過角色授權的無效。就好像完全定在了你調用的那個用戶下了,你用角色授予的權限完全失效。
而調用者權限就是爲了解決定義者權限的一些侷限設計的,它訪問的是用戶所具有的權限包括角色授權的權限。
這種通過調用者權限和動態sql解決。

Oracle規定,在默認的情況下,在調用存儲過程用戶的角色不起作用,即在執行存儲過程時只有Public權限。所以在調用Create table時,會有權限不足的提示。

存儲過程分爲兩種,即DR(Definer’s Rights ) Procedure和IR(Invoker’s Rights ) Procedure。比如說用戶sh創建了刪除表mytable的存儲過程drop_table(),當用戶sh調用時,刪除用戶sh下的表 mytable;如果是另一個用戶scott調用呢?是刪除用戶scott下的mytable表呢,還是刪除用戶sh的mytable呢?另外,如果存儲 過程中包含建表語句,不管是用戶sh還是用戶scott調用都會失敗,因爲Public沒有建表權限,除非爲Public grant建表權限。所以,存儲過程的調用者會面臨兩個問題:

存儲過程的名稱解析環境
存儲過程的執行權限
這兩個問題可以在定義存儲過程時,通過指定AUTHID 屬性,即定義DR Procedure 和IR Procedure來解決。
DR Procedure

1、定 義
CREATE OR REPLACE procedure DEMO(ID in NUMBER) AUTHID DEFINER as

BEGIN

END DEMO;
2、名稱解析環境爲定義該存儲過程的用戶所在的Schema。
3、執行該存儲過程時只有Public權限。

IR Procedure
1、定 義

CREATE OR REPLACE procedure DEMO(ID in NUMBER) AUTHID CURRENT_USER as

BEGIN

END DEMO;
2、名稱解析環境爲調用該存儲過程的用戶所在的Schema。
3、執行該存儲過程時擁有調用者的所有權限,即調用者的Role是有效的。
因此樓主的問題只需要使用IR Procedure就能解決

create procedure   xxx AUTHID CURRENT_USER
as
begin
INSERT INTO  TABLE1 SELECT * FROM USER_B.TABLE1;
EXECUTE IMMEDIATE   ’ INSERT INTO  TABLE1 SELECT * FROM USER_B.TABLE1′;
end;

可以通過   SELECT * FROM SYS.USER_TAB_PRIVS;
查詢出當前用戶“額外”賦予的權限;

發佈了4 篇原創文章 · 獲贊 2 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章