2017-10-26 3 views
0

は、私はこのエラーSELECT_CATALOG_ROLEがあってもDBMS_METADATA.GET_DDLが失敗しますか?次のSQLを使用してトリガのSQLを取得しようとしたとき

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 

を取得します。 SELECT_CATALOG_ROLE
USER_ROLE_PRIVS

DBバージョン::私は、次のUSER_ROLE_PRIVS持っ

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') 

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を使用する回避策について知っています。なぜなら、オラクルのドキュメントによれば、SELECT_CATALOG_ROLEを使用するだけでよいので、get_DDLを使用できない理由を理解する必要があります。

EDIT:少数のノート。
他のデータベースをスキャンするときにこのクエリが正常に動作していますが、なぜこの環境で動作しないのか分かりません。
DBA_SOURCEを使用したくないのは、 'create trigger'などの文が省略されていて、手動で操作する代わりに使用可能な関数を使用したいからです。 (しかし、なぜこれが起こっているのかわからない場合は、DBA_SOURCEを使用して戻る必要があります)
クエリには所有者フィルタがあります。他の不要な情報なしで問題を提示したいので、ここに追加しませんでした。

ことについて

答えて

0

方法:私も所有者を制限する

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

は、そうでない場合、これは実行に時間がかかることがあります。

+0

dba_sourceは、完全なSQL文を提供しないため、使用したくありません。それは行を作成せず、他の問題もあるかどうかは分かりません。 get_ddlは今度は他のデータベースで問題なく私のために働いていますが、このデータベースには何かがありません。私は間違いが何であるか把握しようとしています。 はい所有者に基づいてクエリを制限しています。私はそれが無関係なので、問題を投稿する前に余分なフィルタを削除しました。 –

+0

唯一欠けているのは、「CREATE OR REPLACE」です。これは、テキストに接頭辞を付けて完全なソースを取得します。これまで何年にもわたってこのようにしてきました。 – sandman

+0

どうもありがとうございますが、なぜこの方法がうまくいかないのですか? –

関連する問題