【问题标题】:Oracle user cannot see any content in ALL_MVIEW_COMMENTSOracle 用户看不到 ALL_MVIEW_COMMENTS 中的任何内容
【发布时间】:2019-11-15 18:55:56
【问题描述】:

我已经设置了具有以下授权的最小用户:

CREATE USER X IDENTIFIED BY X;
GRANT CONNECT TO X;
GRANT SELECT ANY TABLE TO X;

According to the documentationSELECT ANY TABLE 权限应该授予:

在除 SYS、AUDSYS 之外的任何架构中查询表、视图或具体化视图。使用 SELECT ... FOR UPDATE 获取行锁。

确实,我可以看到我在另一个模式中创建的物化视图:

SELECT owner, mview_name FROM all_mviews;
SELECT owner, mview_name FROM all_mview_comments;

第一个查询产生:

OWNER   MVIEW_NAME
------------------
TEST    M_LIBRARY

但是第二个查询没有产生任何用户X 的结果。它确实与用户TESTSYS 生成相同的物化视图。一种解决方法是(但我不想这样做):

GRANT SELECT ON TEST.M_LIBRARY TO X;

这是 Oracle 中的(已知)错误吗?还是缺少一些额外的拨款?

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您无法看到使用 all_mview_commentsMVIEW(另一个架构)上创建的 cmets,因为它仅显示您拥有的 MVIEWS

    oracle documents 中明确提到如下:

    ALL_MVIEW_COMMENTS 在物化视图上显示 cmets 当前用户可以访问。

    让我举例说明:

    创建MVIEW 并对用户tejashMVIEW 发表评论:

    C:\Users\Tejash Hingu>sqlplus tejash
    
    SQL*Plus: Release 12.2.0.1.0 Production on Fri Nov 15 16:14:19 2019
    
    Copyright (c) 1982, 2016, Oracle.  All rights reserved.
    
    Enter password:
    Last Successful login time: Fri Nov 15 2019 13:04:48 +05:30
    
    Connected to:
    Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
    
    SQL> CREATE MATERIALIZED VIEW MVIEW_LUKAS
      2      BUILD IMMEDIATE
      3      REFRESH
      4          FORCE
      5          ON DEMAND
      6  AS
      7      SELECT
      8          *
      9      FROM
     10          EMPLOYEES;
    
    Materialized view created.
    
    SQL> COMMENT ON MATERIALIZED VIEW MVIEW_LUKAS IS 'Here is your demo.';
    
    Comment created.
    

    检查来自 tejash 用户的 ALL_MVIEWSALL_MVIEW_COMMENTS 表中的数据

    SQL> SELECT OWNER, MVIEW_NAME
      2  FROM ALL_MVIEWS;
    
    OWNER  MVIEW_NAME
    ------ ------------
    TEJASH MVIEW_LUKAS
    
    
    SQL> SELECT * FROM ALL_MVIEW_COMMENTS;
    
    OWNER    MVIEW_NAME   COMMENTS
    -------- ------------ --------------------
    TEJASH   MVIEW_LUKAS  Here is your demo.
    

    看!!! ALL_MVIEW_COMMENTS 包含来自相同架构的数据。

    授予用户T (GRANT SELECT ANY TABLE TO T;)

    C:\Users\Tejash Hingu>sqlplus / as sysdba
    
    SQL*Plus: Release 12.2.0.1.0 Production on Fri Nov 15 16:18:02 2019
    
    Copyright (c) 1982, 2016, Oracle.  All rights reserved.
    
    
    Connected to:
    Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
    
    SQL> GRANT SELECT ANY TABLE TO T;
    
    Grant succeeded.
    
    SQL>
    

    现在,正在检查来自 T 用户的 ALL_MVIEWSALL_MVIEW_COMMENTS 表中的数据

    C:\Users\Tejash Hingu>sqlplus T
    
    SQL*Plus: Release 12.2.0.1.0 Production on Fri Nov 15 16:18:24 2019
    
    Copyright (c) 1982, 2016, Oracle.  All rights reserved.
    
    Enter password:
    Last Successful login time: Fri Nov 15 2019 16:09:04 +05:30
    
    Connected to:
    Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
    
    SQL> SELECT OWNER, MVIEW_NAME
      2  FROM ALL_MVIEWS;
    
    OWNER    MVIEW_NAME
    -------- ------------
    TEJASH   MVIEW_LUKAS
    
    SQL> SELECT * FROM ALL_MVIEW_COMMENTS;
    
    no rows selected
    
    SQL>
    

    看!!! ALL_MVIEW_COMMENTS 不包含来自不同架构的任何数据。

    希望!!现在很清楚了。

    干杯!!

    【讨论】:

    • 也为你干杯!我可以在ALL_MVIEWS 中看到MVIEW。我使用SELECT ANY TABLE 权限授予用户访问物化视图的权限。
    • 是的,这就是区别所在。您可以在all_mviews 中看到MVIEW,但在all_mview_comments 中,您看不到其他用户拥有的mviews。另请注意,您可以从all_mview_comments 中选择数据,但在那里看不到任何内容。如果您在自己的用户(X)中创建任何MVIEW 并评论MVIEW,那么您将能够在此处看到它。
    • 这毫无意义 :) 同样,SELECT ANY TABLE 授权授予我的用户X 对所有表(和实体化视图)的访问。视图(实际上是两个视图)应该列出当前用户X可访问的所有物化视图。我应该在那里看到它,事实上,如果我明确地授予访问权限(请重新阅读我的问题),那么我可以看到它。
    • 查看我的更新答案和 oracle 文档中写的内容完全匹配
    • 我希望你明白我的意思,我相信你实际上并不知道答案,只是即兴发挥:) 无论如何,谢谢你的尝试。
    猜你喜欢
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多