執行
SQL> create or replace view redo_size as
2 select name, value from v$statname n, v$sesstat t, v$session s
3 where s.audsid = sys_context('USERENV','SESSIONID')
4 and t.sid = s.sid
5 and n.statistic#=t.statistic#
6 and n.name = 'redo size';
select name, value from v$statname n, v$sesstat t, v$session s
*
ERROR at line 2:
ORA-01031: insufficient privileges
但單獨執行
SQL> select name, value from v$statname n, v$sesstat t, v$session s
2 where s.audsid = sys_context('USERENV','SESSIONID')
3 and t.sid = s.sid
4 and n.statistic#=t.statistic#
5 and n.name = 'redo size';
NAME VALUE
redo size 2452
是可以的。
目前使用者的權限包括:
ALTER SESSION
CREATE SESSION
UNLIMITED TABLESPACE
網上有文章說:
1、賦予此方案對象SELECT ANY TABLE 的權限。-這裡嘗試後依舊報錯。
2、使用grant select on v$statname to star,嘗試後也是報錯。
我的了解:star這個使用者可以單獨通路v$statname、v$sesstat、v$session這些字典表,但CREATE VIEW時不行,根據惜分飛的文章介紹,有可能是因為是因為不同schema的問題,總結的:
1)在同一個schema下,有查詢權限,就可以建立視圖。
2)在不同schema下,即使有了查詢權限,建立視圖,還是會提示ORA-01031。
文章中介紹需要sys賬戶将資料字典的通路權限賦予star使用者,但這裡還要注意的是V$SESSION是一個public的同義詞,根據前幾篇部落格介紹的方法,可以看到它封裝的是x$ksuse這個表,好像沒看到過将這種表賦予使用者權限的?
這個問題的解決方法是賦予使用者select any dictionary的權限。但除此之外是否還有其它方法?請高手指點!
>經過高手指教,這個問題最簡單的方法就是用sys賬戶登入,grant select on v_$statname ... to user,将v$引用的v_$權限賦予使用者,就可以了。select any dictionary這個權限最好不要輕易賦予普通使用者。