dbms_metadata.get_ddl无效

时间:2014-09-24 20:40:18

标签: sql oracle

我想在CARD_TABLE架构

中获取表XT的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

但我的选择查询工作

select count(*) from XT.CARD_TABLE;
count(*)
---------
0

我查询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.

2 个答案:

答案 0 :(得分:10)

来自dbms_metadata documentation

  

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

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

即使有这个角色:

  

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

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

答案 1 :(得分:1)

grant SELECT_CATALOG_ROLE to <user> with delegate option;

它对我有用。修改程序后执行此操作

grant SELECT_CATALOG_ROLE to procedure <procedure name>;