以 DBA 身份创建视图时出现 ORA-01031

Chr*_*s.V 0 oracle oracle-11g-r2 permissions

我正在尝试在 Oracle XE 上的 DBA 模式下创建一个视图。我已经在生产数据库上这样做了,并且它与权限比 DBA 角色少得多的用户一起工作。但现在我总是ORA-01031出错。这是我的查询:

CREATE OR REPLACE VIEW usr_v_user_not_reg AS
  SELECT username "User", db_instance "Instance",
    (
      CASE 
        WHEN username IN
        (
          SELECT username
          FROM sys.dba_users
          MINUS
          SELECT username
          FROM usr_t_user_reg
        ) THEN 'not registered'
        WHEN username IN
        (
          SELECT username
          FROM usr_t_user_reg
          MINUS
          SELECT username
          FROM sys.dba_users
        ) THEN 'no longer present'
      END
    ) "Status"
  FROM usr_t_user_reg
  WHERE db_instanz = 'TEST_DB'
    AND username NOT IN
    (
      SELECT username
      FROM usr_t_user_reg
      INTERSECT
      SELECT username
      FROM sys.dba_users
    )
;
Run Code Online (Sandbox Code Playgroud)

这是我得到的输出:

Line: 10 Column:20
SQL-Error: ORA-01031: insufficient privileges
01031. 00000 -  "insufficient privileges"
*Cause:    An attempt was made to change the current username or password
           without the appropriate privilege. This error also occurs if
           attempting to install a database without the necessary operating
           system privileges.
           When Trusted Oracle is configure in DBMS MAC, this error may occur
           if the user was granted the necessary privilege at a higher label
           than the current login.
Run Code Online (Sandbox Code Playgroud)

我什至用 SYS 帐户尝试过,但结果相同。我错过了什么重要的东西吗?

mir*_*173 5

创建表 usr_t_user_reg
(用户名 varchar2(30),
db_instance varchar2(30),
主键(用户名,db_instance)
)
/

创建或替换视图 usr_v_user_not_reg AS
  选择用户名“用户”,db_instance“实例”,
    (
      案件
        当用户名输入
        (
          选择用户名
          从 sys.dba_users
          减
          选择用户名
          从 usr_t_user_reg
        ) THEN '未注册'
        当用户名输入
        (
          选择用户名
          从 usr_t_user_reg
          减
          选择用户名
          从 sys.dba_users
        ) THEN '不再存在'
      结尾
    ) “地位”
  从 usr_t_user_reg
  WHERE db_instance = 'TEST_DB'
    并且用户名不在
    (
      选择用户名
      从 usr_t_user_reg
      相交
      选择用户名
      从 sys.dba_users
    )
/

使用sqlplus运行脚本会给出以下错误消息

Table created.

          FROM sys.dba_users
               *
ERROR at line 8:
ORA-01031: insufficient privileges
Run Code Online (Sandbox Code Playgroud)

这是Oracle 数据库错误消息 11g 第 2 版的错误描述没有给出有用提示的错误之一

ORA-01031: 权限不足

原因:试图在没有适当权限的情况下更改当前用户名或密码。如果在没有必要的操作系统权限的情况下尝试安装数据库,也会发生此错误。在 DBMS MAC 中配置 Trusted Oracle 时,如果在比当前登录名更高的标签上授予用户必要的权限,则可能会发生此错误。

行动:要求数据库管理员执行操作或授予所需的权限。对于受信任的 Oracle 用户虽然在更高的标签上授予了适当的权限但收到此错误,请要求数据库管理员在适当的标签上重新授予权限。

Oracle 数据库 SQL 语言参考 11g 第 2 版中,您可以找到以下创建视图的先决条件

包含视图的架构的所有者必须具有从视图所基于的所有表或视图中选择、插入、更新或删除行所需的权限。所有者必须直接被授予这些权限,而不是通过角色。

SELECT_CATALOG_ROLE 角色和 DBA 角色都不足以创建您的视图。

所以发出一个

GRANT SELECT ON DBA_USERS TO your_user;
Run Code Online (Sandbox Code Playgroud)

现在您的视图将起作用。

您可以授予系统特权 SELECT ANY DICTIONARY,而不是对象特权 SELECT ON DBA_USERS。与 SELECT_CATALOG_ROLE 相比,这不是角色而是系统权限。

请注意,错误消息位于 CREATE VIEW 语句的第 8 行,该行实际上包含导致错误的对象。