即使我有SELECT_CATALOG_ROLE,DBMS_METADATA.GET_DDL也会失败?

时间:2017-10-26 07:22:04

标签: oracle permissions user-roles

我收到此错误

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_ROLE
USER_ROLE_PRIVS

DB VERSION:

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 个答案:

答案 0 :(得分:0)

怎么样:

SELECT
s.OWNER AS SCHEMA,
s.name AS NAME,
s.text as "SQL"
FROM SYS.dba_source s
WHERE s.TYPE IN ('TRIGGER');

我也会限制所有者,否则这可能需要很长时间才能执行。