Gibt es eine gute Abhilfe, um die Oracle-IMPDP REMAP_SCHEMA Problem mit Triggern (ORA-39083, ORA-00942)?
Kann man verwenden Oracle data pump-import-tool (IMPDP.EXE zum importieren von einem schema in ein anderes mit der REMAP_SCHEMA option. Allerdings gibt es ein Problem, dass die Trigger nicht richtig zugeordnet. Dies führt zu der trigger nicht erstellt wird, mit einer Fehlermeldung wie folgt:
ORA-39083: Object type TRIGGER failed to create with error: ORA-00942: table or view does not exist Failing sql is: CREATE TRIGGER "**NEW_SCHEMA**"."METER_ALARMS_BI" BEFORE INSERT ON
**OLD_SCHEMA**.METER_ALARMS ...
Der Grund für dieses ist, weil das erstellen von SQL-bezieht sich noch auf OLD_SCHEMA. Es sagt, dass in der Oracle-Dokumentation:
Die Zuordnung kann nicht 100 Prozent
vollständig, denn es gibt bestimmte
schema-Referenzen, die den Import nicht
in der Lage zu finden. Zum Beispiel,
Import finden nicht schema-Referenzen
eingebettet innerhalb des Körpers
Definitionen von Typen, views,
Prozeduren und packages.
IMHO ist dies ein bit von a cop-out von Oracle-aber das ist eine andere Diskussion!
Laut Oracle Metalink note 750783.1, die Abhilfe ist:
- Erstellen Sie eine SQLFILE, die relevanten DDL-Befehl(en):
impdp system/****** directory=test_dp
DUMPFILE=export_schemas.dmp
remap_schema=u1:u2 sqlfile=script.sql
- - Extrakt die betroffenen DDL aus der SCHRIFTLICHEN SQLFILE und korrigieren Sie die
schema reference. Dann führen Sie den Befehl manuell ein.
Dies ist nicht ein guter Weg, es zu tun, vor allem, wenn Sie viele fehlerhafte Objekte und automatisieren möchten, den Prozess der Kombination mehrerer schema-für-Feld Aktualisierung von Datenbanken.
Hat jemand einen besseren Weg gefunden, dies zu tun? Ich brauche eine Lösung, dass muss 100% zuverlässig sein, wenn Ihr im Feld verwendet. Ich könnte Parsen der generierten SQL-Datei, aber kann man dies 100% korrekt ist? Gibt es nicht irgendeine Weise abfangen, die das ERSTELLEN von SQL-Anweisungen ausführen, die von IMPDP und korrigieren Sie es on the fly " beim Import? Könnte ein patch der DMP-Datei direkt?
- Ich begann zu schreiben, dies als eine Antwort, aber es ist wirklich mehr eine Bemerkung - ich kann mir nicht vorstellen, dass es eine guten Grund für das schema name als Objekt-Qualifizierer in einem anderen Objekt, das das schema besitzt. Es ist mir nicht klar, was die Kontrolle über die Datenbanken, die Sie aktualisieren, aber ich würde Stimmen für eine einmalige Bereinigung dieser Verweise zu beseitigen das problem an der Quelle. In der pre-DataPump Tage (exp/imp), habe ich direkt geändert .dmp-Dateien ein paar mal ohne Probleme, aber noch nicht angeschaut, das neuere format. Offensichtlich sind Sie auf Ihre eigenen so weit wie Oracle ist besorgt, wenn Sie dies tun.
- Punkt zu beachten: wir sind der Umgang mit einige legacy-Objekte, die bereinigt werden wir aber auch eine Besitzer-weniger-schema, IMPDP ist REMAP_SCHEMA noch nicht richtig mit Trigger. Und ja, ich habe auch "gepatcht" die DMP-Datei direkt zuordnen schema, aber ich finde, es gibt weniger Probleme, wenn eine DMP-Datei erstellen EXP anstatt EXPDP.
- Mit der SQLFILE option zum generieren der SQL-Ausführung durch IMPDP wie vorgeschlagen von Oracle gibt auch Probleme bei der Verwendung von SQL*Plus ausgeführt werden: - Random cr/lf in der gespeicherten Prozedur Kommentare, gibt 'ORA-00933: SQL-Befehl nicht korrekt beendet" etc. Generierte SQL ist zu lang für die Aussicht gibt "SP2-0027: Eingabe ist zu lang (> 2499 Zeichen) - Zeile ignoriert".
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kann man sich ein DBMS_METADATA
Gibt es eine REMAP_SCHEMA option für, die. Nicht sicher, ob es funktioniert besser als DATAPUMP (und ich würde vermuten, dass DATAPUMP verwenden würde, DBMS_METADATA unter der Decke). Aber es wäre einfacher zu "post-Prozess" - Ausgang.
Ich denke, es hängt davon ab, ob die schema-Namen in Ihrem code als Teil von etwas, das nicht einen schema-Namen. Zum Beispiel, Sie haben die variable Namen mit den gleichen Zeichen wie die schema-Namen. Wenn nicht, dann glaube ich nicht, es wäre schwer zu Skript ein Prozess, der änderungen der generierten trigger erstellen Sie scripts ersetzt das alte schema mit der neuen ein. Vielleicht können Sie datapump export/import der Objekt-Typen, die keine text-code (nicht Trigger, packages, Prozeduren, Funktionen, etc.) und dann dump SQL für die code-Objekte und ersetzt einfach alte schema mit neuen.
Wenn das alte schema name erscheint in Orten, die Sie nicht wollen, zu ersetzen, es würde schwieriger sein, zu tun. Sie könnten extrahieren Sie den code, Objekte und versuchen, um Sie zu erstellen und sammeln Sie alle Fehler. Dann Holen Sie sich die Namen der Objekte, die es nicht auf und versuchen, anstelle der oldschema.Objektname mit newschema.Objektname basiert auf den Fehler und führen Sie erneut.
Beispiel, wie Sie vielleicht Bearbeiten Sie das schema in die trigger-text angenommen, es gibt keine Zeichenfolgen wie oldschema. dass Sie nicht wollen, zu ersetzen:
Beispiel