天天看點

【Oracle】-【ORA-01031】-建立基于資料字典表的視圖無權限的問題

執行

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這個權限最好不要輕易賦予普通使用者。