我想在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.
答案 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>;