日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Oracle-PROCEDURE权限解读

發布時間:2025/3/21 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle-PROCEDURE权限解读 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題

存過中有查詢dba_相關的數據字典視圖,編譯時卻提示 ‘表或視圖不存在’,編譯不通過。

但是報錯的語句在SQL中確實可以查到的,說明問題并不是提出給出的’表或視圖不存在’導致的。

這里需要注意SQL權限和存過的權限是不同的。

我們查詢的是sys用戶下的數據字典,需要顯示授權
雖然cc用戶也是DBA用戶。

select * from dba_role_privs where grantee='CC';


解決辦法

oracle存儲過程默認定義者權限,但ROLE對存儲過程不可見。
因此需要給cc用戶顯示賦權。 使用authid current_user也不行。

使用sys用戶

grant select any dictionary to cc;

重新編譯,通過


知識引申

oracle存儲過程分兩種,DR(Definer’s Rights ) Procedure和IR(Invoker’s Rights ) Procedure。

在執行存儲過程時,我們可能會遇到權限問題

  • AUTHID DEFINER (定義者權限):指編譯存儲對象的所有者。也是默認權限模式。
  • AUTHID CURRENT_USER(調用者權限):指擁有當前會話權限的模式,這可能和當前登錄用戶相同或不同(alter session set current_schema 可以改變調用者Schema)

在數據庫中創建存儲過程時,定義者權限是缺省模式。

當指定AUTHID CURRENT_USER關鍵字后,便是調用者權限存儲過程.

它們之間最根本的差異在于role能否在存儲過程中生效


定義者權限存儲過程問題

定義者權限存儲過程role無效,必須要有顯式授權。即便是擁有dba role,還是不能訪問不同用戶的表。

有時候可能需要進行非常多的授權才能執行存儲過程,稍顯麻煩。

oracle給我們提供了在存儲過程中使用role權限的方法:
修改存儲過程,加入Authid Current_User時存儲過程可以使用role權限(調用者權限)。

栗子

編譯通過

執行失敗。

方法一:使用sys用戶賦權限

SQL> conn sys/****** as sysdba; Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 Connected as sys@cc AS SYSDBASQL> grant create table to cc;Grant succeeded

重新執行

SQL> exec p_test_proc_priv;PL/SQL procedure successfully completed

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

現在先回收掉權限,改用另外的方式

SQL> conn sys/****** as sysdba; Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 Connected as sys@cc AS SYSDBA SQL> revoke create table from cc;Revoke succeeded

重新執行后:

SQL> exec p_test_proc_priv;begin p_test_proc_priv; end;ORA-01031: insufficient privileges ORA-06512: at "CC.P_TEST_PROC_PRIV", line 4 ORA-06512: at line 2

直白的說,就是讓這個存過擁有當前用戶的權限,如果這個用戶可以create table,那么這個存過通過authid current_user,也獲得該用戶的權限。


修改存過

記得先把已經 exec 執行存過創建的表 drop掉,否則報錯。


ORACLE權限相關

查看一個用戶的所有系統權限(包含角色的系統權限)

select privilege from dba_sys_privs where grantee='DATAUSER' union select privilege from dba_sys_privs where grantee in (select granted_role from dba_role_privs where grantee='DATAUSER' );

查看Oracle提供的系統權限

select name from sys.system_privilege_map a order by a.name ;

oracle 11g中 209條數據

總結

以上是生活随笔為你收集整理的Oracle-PROCEDURE权限解读的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。