【问题标题】:dbms_metadata.get_ddl not workingdbms_metadata.get_ddl 不工作
【发布时间】:2021-04-06 06:31:04
【问题描述】:

我想在XT模式中获取表CARD_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

但我的选择查询有效

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.

【问题讨论】:

  • 不是VIEWMATERIALIZED VIEW 还是SYNONYM'. See DBA_OBJECTS`。
  • @Ivan 更新,它仍然有 TABLE 。我如何得到这个定义?

标签: sql oracle


【解决方案1】:

来自dbms_metadata documentation

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

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

即使是那个角色:

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

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

【讨论】:

  • Oracle 可能没有显示权限/访问错误 :)
  • I have already SELECT_CATALOG_ROLE granted but when select dbms_metadata.get_ddl it return error : ORA-06512: at "SYS.DBMS_METADATA", line 2625 ORA-06512: at "SYS.DBMS_METADATA", line 2668 ORA -06512:在“SYS.DBMS_METADATA”,第 2983 行 ORA-06512:在“SYS.DBMS_METADATA”,第 3897 行 ORA-06512:在“SYS.DBMS_METADATA”,第 5678 行 ORA-06512:在第 1 行 31603.00000 - “在模式 \"%s\"" 中找不到类型为 %s 的对象 \"%s\" *原因:在数据库中找不到指定的对象。 *操作:更正对象规范并再次尝试调用。
  • @adramazany - 提出一个新问题,显示您正在运行的语句以及错误。还显示来自dba_objects 的相关对象的条目,以及您当前用户对该对象拥有的所有权限。确保对象类型和名称完全匹配dba_objects,包括对象名称的大小写...
  • @adramazany 我也有同样的问题。你找到解决方案了吗。我们还授予了 .SELECT_CATALOG_ROLE 权限。
  • 我执行 grant SELECT ANY DICTIONARY 查询。通过这个我的 SELECT * FROM sys.dba_objects where owner ='SCHEMA' and object_type = 'TABLE' 查询针对另一个模式运行,但是 SELECT DBMS_METADATA.GET_DDL('TABLE','TASK','OPENSKYE') FROM dual 给出错误 - ORA-31603: 在模式 "OPENSKYE" 中找不到类型为 TABLE 的对象 "TASK" "在模式 \"%s\"" 中找不到类型为 %s 的对象 \"%s\" *原因:找不到指定的对象在数据库中。 *操作:更正对象规范并再次尝试调用。
【解决方案2】:
grant SELECT_CATALOG_ROLE to <user> with delegate option;

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

grant SELECT_CATALOG_ROLE to procedure <procedure name>;

【讨论】:

  • 这个解决方案在 12.1 中对我有用,而“authid current_user”没有
猜你喜欢
  • 1970-01-01
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
  • 2010-12-03
  • 2021-05-03
  • 2018-04-07
  • 2016-05-29
  • 1970-01-01
相关资源
最近更新 更多