2017-10-26 5 views
0

ich diesen FehlerDBMS_METADATA.GET_DDL schlägt fehl, obwohl ich SELECT_CATALOG_ROLE habe?

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 

beim Versuch, die SQL für Trigger mit der folgenden SQL zu erhalten.

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

Ich habe folgende 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 

ich herauszufinden versucht habe, was falsch ist, aber ich habe in eine Sackgasse kommen. Überall, wo ich suche, heißt es, dass alles, was ich brauche, SELECT_CATALOG_ROLE ist, es sei denn, ich führe dies in einer Prozedur aus. Ich führe die SQL über eine JDBC-Verbindung, aber ich bekomme immer noch den Fehler, auch wenn ich es mit einem SQL-Client ausführen.

Bitte lassen Sie mich wissen, wenn Sie andere Berechtigungen, die ich habe, wissen müssen. Ich kenne bereits die Problemumgehung, DBA_SOURCE zu verwenden, ich muss nur verstehen, warum ich get_DDL nicht verwenden kann, da ich laut den Oracle-Dokumenten nur SELECT_CATALOG_ROLE haben muss, um es verwenden zu können.

EDIT: Ein paar Notizen.
Diese Abfrage hat beim Scannen anderer Datenbanken korrekt funktioniert. Ich weiß nicht, warum dies in dieser Umgebung nicht funktioniert.
Ich möchte nicht DBA_SOURCE verwenden, da es einige Anweisungen wie "create trigger" auslässt und ich die verfügbaren Funktionen anstelle von manuellen Manipulationen verwenden möchte. (Wenn aber niemand herausfinden kann, warum das passiert, muss ich wieder DBA_SOURCE verwenden)
Die Abfrage hat einen Eigentümerfilter Ich habe sie hier nicht hinzugefügt, da ich das Problem ohne weitere unnötige Informationen

darstellen wollte

Antwort

0

Wie wäre es tun:

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

ich den Besitzer auch sonst begrenzen würde dies eine lange Zeit für die Ausführung übernehmen könnte.

+0

Ich möchte nicht dba_source verwenden, da es nicht die vollständige SQL-Anweisung gibt. Es lässt die Create-Zeile aus und ich bin mir nicht sicher, ob es auch andere Probleme damit hat. get_ddl hat die ganze Zeit ohne Probleme für andere Datenbanken gearbeitet, aber in dieser Datenbank fehlt etwas. Ich versuche herauszufinden, was der Fehler ist. Ja, ich beschränke die Abfrage basierend auf dem Besitzer. Ich habe zusätzliche Filter entfernt, bevor das Problem veröffentlicht wurde, da es irrelevant ist. –

+0

Die einzige fehlende Sache ist "ERSTELLEN ODER ERSETZEN", die ich dem Text voranstelle, um die vollständige Quelle zu erhalten. Ich mache es seit Jahren so und bisher keine Probleme. – sandman

+0

Okay danke, aber wieso funktioniert diese Methode nicht? –

Verwandte Themen