代码之家  ›  专栏  ›  技术社区  ›  user2102665

在PL SQL游标中查询DBA\U表和USER\U表

  •  2
  • user2102665  · 技术社区  · 7 年前

    我在PLSQL过程中有一个光标可供选择 DBA_TABLES USER_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表或视图不存在”

    执行期间。

    2 回复  |  直到 7 年前
        1
  •  2
  •   krokodilko    7 年前

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

    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
  •  0
  •   Peter G    5 年前

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

    grant select any dictionary to your-username;
    

    “选择任何字典”权限允许用户查询SYS架构中的任何数据字典对象,但以下对象除外:DEFAULT\u PWD$、ENC$、LINK$、user$、user\u HISTORY$和XS$验证器。

    顺便提一下,问题中的c1游标可能不需要访问DBA\U表。以下查询应生成相同的结果:

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