DBMS_METADATA.GET_DDL 失败,即使我有 SELECT_CATALOG_ROLE?
Posted
技术标签:
【中文标题】DBMS_METADATA.GET_DDL 失败,即使我有 SELECT_CATALOG_ROLE?【英文标题】:DBMS_METADATA.GET_DDL Fails even though I have SELECT_CATALOG_ROLE? 【发布时间】:2018-04-07 11:13:56 【问题描述】:我收到这个错误
java.sql.SQLException: ORA-31603: object "XXX" of type TRIGGER not found in schema "YYYY"
ORA-06512: at "SYS.DBMS_METADATA", line 6069
ORA-06512: at "SYS.DBMS_METADATA", line 8666
ORA-06512: at line 1
当尝试使用以下 sql 获取触发器的 sql 时。
SELECT
s.OWNER AS SCHEMA,
s.object_name AS NAME,
dbms_metadata.get_DDL(s.object_type,s.object_name,s.owner) AS "SQL"
FROM SYS.DBA_OBJECTS s
WHERE s.OBJECT_TYPE IN ('TRIGGER')
我有以下 USER_ROLE_PRIVS:SELECT_CATALOG_ROLEUSER_ROLE_PRIVS
数据库版本:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
PL/SQL Release 12.1.0.2.0 - Production
"CORE 12.1.0.2.0 Production"
TNS for IBM/AIX RISC System/6000: Version 12.1.0.2.0 - Production
NLSRTL Version 12.1.0.2.0 - Production
我试图找出问题所在,但我走到了死胡同。 我搜索的所有地方都说我需要的只是 SELECT_CATALOG_ROLE ,除非我在一个过程中运行它。 我正在通过 JDBC 连接运行 sql,但是即使我使用 sql 客户端运行它,我仍然会收到错误。
如果您需要了解我拥有的任何其他权限,请告诉我。我已经知道使用 DBA_SOURCE 的解决方法,我只需要了解为什么我不能使用 get_DDL,因为根据 oracle 文档,我只需要 SELECT_CATALOG_ROLE 就可以使用它。
编辑:一些注释。 此查询在扫描其他数据库时一直正常运行我不知道为什么这在此环境中不起作用。 我不想使用 DBA_SOURCE,因为它省略了一些语句,例如“创建触发器”,我想使用可用的函数而不是手动操作。 (但是,如果没有人能弄清楚为什么会发生这种情况,我将不得不重新使用 DBA_SOURCE) 该查询有一个所有者过滤器,我没有在此处添加它,因为我想在没有任何其他不必要信息的情况下呈现问题
【问题讨论】:
【参考方案1】:怎么样:
SELECT
s.OWNER AS SCHEMA,
s.name AS NAME,
s.text as "SQL"
FROM SYS.dba_source s
WHERE s.TYPE IN ('TRIGGER');
我也会限制所有者,否则这可能需要很长时间才能执行。
【讨论】:
我不想使用 dba_source 因为它没有给出完整的 sql 语句。它省略了创建行,我不确定它是否还有其他问题。 get_ddl 一直在为我工作,在其他数据库上没有任何问题,但是这个数据库中缺少一些东西。我试图弄清楚错误是什么。是的,我正在根据所有者限制查询。我在发布问题之前删除了额外的过滤器,因为它无关紧要。 唯一缺少的是“CREATE OR REPLACE”,我在文本前加上前缀以获得完整的源代码。多年来一直这样做,到目前为止没有任何问题。 好的,谢谢,但是您知道为什么这种方法不起作用吗? 不,它对我有用。你真的有触发器吗? ora-31603 说 *原因:在数据库中找不到指定的对象。 这会返回什么:select count(*) from dba_objects where object_type='TRIGGER';以上是关于DBMS_METADATA.GET_DDL 失败,即使我有 SELECT_CATALOG_ROLE?的主要内容,如果未能解决你的问题,请参考以下文章
ORA-00904: "DBMS_METADATA"."GET_DDL": 标识符无效
Oracle利用dbms_metadata.get_ddl查看DDL语句
执行DBMS_METADATA.get_ddl报ORA-39212的解决方法