【问题标题】:Query DBA_TABLES and USER_TABLES in PL SQL cursor在 PL SQL 游标中查询 DBA_TABLES 和 USER_TABLES
【发布时间】:2018-04-10 03:15:00
【问题描述】:

我在 PLSQL 过程中有一个光标可以从 DBA_TABLESUSER_TABLES 中进行选择。

CURSOR c1 IS
  SELECT DISTINCT(DB.TABLE_NAME) FROM DBA_TABLES DB, USER_TABLES UT WHERE DB.TABLE_NAME = UT.TABLE_NAME AND DB.IOT_TYPE IS NOT NULL;

BEGIN
  OPEN c1;
  FETCH c1  INTO IOT_TABLE;
  CLOSE c1;

但是程序抱怨

“ORA-00942 表或视图不存在”

在执行期间。

【问题讨论】:

  • 执行过程的用户必须有权限从这个视图中选择,除非过程是用 AUTHID DEFINER 子句创建的,在这种情况下定义者(所有者)必须有权限来查询这个视图.向您的 DBA 寻求适当的权利。
  • 我尝试创建带有 AUTHID DEFINER 子句的过程,但仍然出现同样的错误:CREATE OR REPLACE PROCEDURE DB_MIGRATION AUTHID DEFINER AS

标签: oracle cursor ora-00942


【解决方案1】:

用户必须对该视图具有 SELECT 权限。
要检查用户是否对该视图具有 SELECT 权限,请以该用户身份登录并运行以下查询:

select * from user_tab_privs WHERE table_name = 'DBA_TABLES';

如果此查询返回 none,则用户无权访问该视图,并且看不到它。


要将此权限授予该用户,请以 SYS 或 SYSTEM 身份登录,然后发出:

GRANT select ON DBA_TABLES TO username;

在此之后,用户应该会看到如下所示的结果,并且可以访问该视图:

select table_name, privilege from user_tab_privs WHERE table_name = 'DBA_TABLES';

TABLE_NAME PRIVILEGE                               
---------- ---------
DBA_TABLES SELECT                                  

【讨论】:

    【解决方案2】:

    如果您只需要 DBA_TABLES,请按照 krokodilko 回答中的步骤操作。如果您需要查询多个数据字典对象,SELECT ANY DICTIONARY 权限是另一种选择。它授予对 DBA 视图(包括 DBA_TABLES)的选择访问权限。以 SYSTEM 身份登录并运行:

    grant select any dictionary to your-username;
    

    SELECT ANY DICTIONARY 权限允许用户查询 SYS 架构中的任何数据字典对象,但以下对象除外:DEFAULT_PWD$、ENC$、LINK$、USER$、USER_HISTORY$ 和 XS$VERIFIERS。

    顺便提一下,问题中的 c1 游标可能不需要访问 DBA_TABLES。以下查询应该产生相同的结果:

    CURSOR c1 IS
      SELECT TABLE_NAME FROM USER_TABLES WHERE IOT_TYPE IS NOT NULL;
    

    【讨论】:

      猜你喜欢
      • 2018-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      相关资源
      最近更新 更多