ORA-01031 创建视图时

Posted

技术标签:

【中文标题】ORA-01031 创建视图时【英文标题】:ORA-01031 when creating a view 【发布时间】:2013-12-09 15:11:11 【问题描述】:

我开始阅读 Tom Kyte 的书并立即遇到了一个问题 :) - sql 执行得很好,但基于该 sql 的 CREATE VIEW 返回 ORA-01031。

以下命令代表“系统”用户执行:

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;

第 3 行出现错误: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;

【问题讨论】:

与您的问题无关,但是:SYSTEM 用户的身份创建新对象 您可能无权创建视图。 系统被用来找出权限不足 - 只是为了简单起见 @OldProgrammer 系统用户确实具有“创建视图”权限 - 已验证 【参考方案1】:

system 用户缺少select any dictionary 权限,或者直接授予select on [v_$mystat|v_$statname | v_$latch] 对象权限(不是通过dba 角色),而不是create view 之一。这就是您无法在系统架构中创建该视图的主要原因。只要您将上述权限之一授予system 用户,您就可以成功创建视图,但是,请尝试从不在系统模式中创建用户对象,无论是@ 987654327@ 或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.

【讨论】:

非常感谢,尼古拉斯! 我还不清楚一件事 - 为什么选择不需要“选择任何字典”但“创建视图为...”却需要? @ValeryC 其实system用户有select any dictionary系统权限被授予,但是是通过dba角色授予的,不是直接授予的。为了能够创建引用另一个模式中的对象的视图或能够在 PL/SQL 中引用该对象,必须直接授予某些权限,而不是通过角色授予。

以上是关于ORA-01031 创建视图时的主要内容,如果未能解决你的问题,请参考以下文章

ORA-01031权限不足怎么解决?

ORA-01031: 创建包时权限不足

Oracle ORA-01031: 创建用户时权限不足

创建同义词 ora-01031 权限不足

oracle常用语句

ORACLE - 已授予创建过程但无法创建过程