問題
存過中有查詢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 SYSDBASQL> revoke create table from cc;Revoke succeeded
重新執行後:
SQL> exec p_test_proc_priv;begin p_test_proc_priv; end;ORA-01031: insufficient privilegesORA-06512: at "CC.P_TEST_PROC_PRIV", line 4ORA-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條資料