dbms_metadata.get_ddl无效

use*_*819 9 sql oracle

我想CARD_TABLEXT架构中 获取Table的DDL

SQL> select dbms_metadata.get_ddl('TABLE','CARD_TABLE','XT') from dual;
    ERROR:
    ORA-31603: object "CARD_TABLE" of type TABLE not found in
    schema "XT"
    ORA-06512: at "SYS.DBMS_METADATA", line 5746
    ORA-06512: at "SYS.DBMS_METADATA", line 8333
    ORA-06512: at line 1
Run Code Online (Sandbox Code Playgroud)

但我的选择查询工作

select count(*) from XT.CARD_TABLE;
count(*)
---------
0
Run Code Online (Sandbox Code Playgroud)

我查询dba_objects它仍然得到了表:

    SQL> select owner,object_type from DBA_OBJECTS
    where object_name='CARD_TABLE'  2
      3  ;


PUBLIC     SYNONYM
    XT     TABLE PARTITION
    XT     TABLE PARTITION
    XT     TABLE PARTITION
    XT     TABLE
    XT     TABLE PARTITION
    VAT    TABLE

    7 rows selected.
Run Code Online (Sandbox Code Playgroud)

Ale*_*ole 11

dbms_metadata文档:

如果非特权用户被授予对其他人模式中对象的某种形式的访问权限,他们将能够通过Metadata API检索授权规范,但不能检索对象的实际元数据.

因此,除非您以特权用户身份进行连接,否则您无法看到其他用户对象的DDL.您需要连接as SYS或者SELECT_CATALOG_ROLE授予用户角色才能获得XT的对象定义.

即使有这个角色:

在存储过程,函数和定义者权限包中,禁用角色(例如SELECT_CATALOG_ROLE).因此,这样的PL/SQL程序只能在其自己的模式中获取对象的元数据.如果要编写PL/SQL程序来获取不同模式中对象的元数据(基于调用者拥有SELECT_CATALOG_ROLE),则必须使程序调用者具有权限.

如果您dbms_metadata从一个无关紧要的匿名PL/SQL块调用,但如果您从一个过程调用它,则必须在过程声明中包含一个AUTHID子句,然后添加AUTHID CURRENT_USER.

  • Oracle可能没有显示任何权限/访问错误:) (2认同)