2013-12-09 52 views
1

我開始閱讀Tom Kyte的書,並立即遇到問題:) - sql執行得很好,但基於該sql的CREATE VIEW返回ORA-01031。創建視圖時ORA-01031

命令下面代表 「系統」 用戶的被執行:在3線

create or replace view stats 
as select 'STAT...' || a.name name, b.value 
     from v$statname a, v$mystat b 
    where a.statistic# = b.statistic# 
    union all 
    select 'LATCH.' || name, gets 
     from v$latch 
    union all 
    select 'STAT...Elapsed Time', hsecs from v$timer; 

ERROR:ORA-01031:足夠的特權

然而執行SQL呈現沒有錯誤:

select 'STAT...' || a.name name, b.value 
     from v$statname a, v$mystat b 
    where a.statistic# = b.statistic# 
    union all 
    select 'LATCH.' || name, gets 
     from v$latch 
    union all 
    select 'STAT...Elapsed Time', hsecs from v$timer; 
+2

無關您的問題,而是:做**不**創建新的對象爲 –

+0

您可能沒有權限來創建一個視圖'SYSTEM'用戶。 – OldProgrammer

+0

系統被用來找出缺乏特權 - 僅僅爲了簡單起見 – ValeryC

回答

3

system用戶缺少select any dictionary特權,或select on [v_$mystat|v_$statname | v_$latch]直接授予對象特權(不是通過dba角色),而不是create view之一。這是您無法在系統模式中創建該視圖的主要原因。只要您向system用戶授予上述權限之一,您就可以成功創建視圖,但是,請嘗試從不在系統架構中創建用戶對象,無論是sys還是system。創建單獨的用戶,授予適當的權限並執行任何您想要的操作。

SQL> show user; 
USER is "SYSTEM" 

SQL> create or replace view v_1 as 
    2 select * 
    3  from v$mystat; 

from v$mystat 
     * 
ERROR at line 3: 
ORA-01031: insufficient privileges 


SQL> conn/as sysdba 
Connected. 

SQL> grant select any dictionary to system; 

Grant succeeded. 

SQL> conn system/pwd -- connect as system 

Connected. 

SQL> create or replace view v_1 as 
    2 select * 
    3  from v$mystat; 

View created. 

SQL> drop view v_1; 

View dropped. 
+0

非常感謝,尼古拉斯! – ValeryC

+0

有一件事情我仍然不清楚 - 爲什麼「選擇任何字典」不是選擇所必需的,而是「創建視圖爲...」所必需的? – ValeryC

+1

@ValeryC事實上,'system'用戶擁有'選擇授予的任何字典'系統特權,但它是通過'dba'角色授予的,而不是直接授予的。爲了能夠創建一個引用另一個模式中的對象的視圖,或者能夠在PL/SQL中引用該對象,必須直接授予某些權限,而不是通過該角色。 –