我想CARD_TABLE在XT架构中 获取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
如果非特权用户被授予对其他人模式中对象的某种形式的访问权限,他们将能够通过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.