oracle 觸發器中 用 v_$session 問題讨論
在非系統使用者底下建觸發器時引用v$session記錄類型時出現問題
錯誤:“表和視圖不存在”
但是在 pl/sql 中是可以運作 select * from v$session 的
v$session是同義詞,v_$session是視圖
需要以下處理:
可直接授權
sys : grant select on v_$session to youruser;
說明:
這是個很好的問題
一個普通使用者,具有了select any dictionary的權限後,就可以通路任何一個系統視圖,包括v$session,由于dba角色包含了select any dictionary的權限,是以你的hospital使用者select * from v$session是沒問題的
但是你在PL/SQL中,要參照一個表rowtype或者在定義cursor的時候使用到某個表,那你得在這個表上有select權,盡管你的dba角色有select any table的權限,但由于在9i中規定
在初始化參數O7_DICTIONARY_ACCESSIBILITY取預設值(false)的情況下,一個使用者即使有select any table的權限,卻還是不能通路sys對象的,除非
1 把O7_DICTIONARY_ACCESSIBILITY設定為true,也就是偶說的做法
或者
2 直接把sys對象的select權授予給這個使用者,也就是biti所說的做法
在存儲對象中引用字典表(視圖)必須單獨授權
SQL> select synonym_name,table_name from dba_synonyms where synonym_name like '%SESSION%';
SYNONYM_NAME TABLE_NAME
------------------------------ ------------------------------
V$SESSION V_$SESSION
v$session是同義詞,v_$session是視圖
這個問題,本質上,是pl/sql程式的特點的問題
在 pl/sql程式設計一書中有講到,由于 pl/sql 的編譯的一些特性,oracle 采取了 角色在 存儲過程、函數、包 等有名pl/sql 中 不起作用的政策,必須直接授權才生效,是以即使有dba角色在存儲過程中也是無效的