Frage

Einige der Trigger in meiner Datenbank werden nach bestimmten Änderungen an den Tabellen ungültig.Aber es scheint, dass sie immer noch funktionieren.Das einzige Problem, das ich habe, ist, wenn ich SQL Developer verwende, dass auf der linken Seite der Trigger rote Kreuze anzeigen, dass sie ungültig sind.Ist es ein großes Problem?

Ich weiß, dass ich den Trigger neu kompilieren kann, um das zu beheben, aber ich bin mir nicht sicher, ob dies wirklich ein Problem ist, das es wert ist, besorgt zu sein.In diesem Fall muss ich meine vorherigen Hunderte von Änderungen überprüfen und herausfinden, was das Problem verursacht.Danke.

War es hilfreich?

Lösung

Immer wenn wir eine Änderung an einem Datenbankobjekt bereitstellen, wird jeder Code, der davon abhängt, ungültig.Dies betrifft Trigger, Ansichten und gespeicherte Prozeduren.Wenn jedoch das nächste Mal etwas diesen Code aufruft, kompiliert die Datenbank ihn automatisch neu.

Also brauchen wir uns darüber keine Sorgen zu machen, oder?Nun ja, bis zu einem gewissen Punkt.Die Sache ist, dass die Ungültigmachung der Auslöser (oder was auch immer) für uns ein Hinweis darauf ist, dass eine Änderung vorgenommen wurde, die sich auf die Funktionsweise dieses Auslösers auswirken könnte, was Nebenwirkungen haben könnte.Der offensichtlichste Nebeneffekt ist, dass der Trigger nicht kompiliert wird.Subtiler gesagt, der Trigger wird kompiliert, schlägt jedoch während des Betriebs fehl.

Daher ist es eine gute Idee, die Neukompilierung von Triggern in einer Entwicklungsumgebung zu erzwingen, um sicherzustellen, dass unsere Änderung nichts grundlegend kaputt gemacht hat.Aber wir können diesen Schritt überspringen, wenn wir unsere Änderung in der Produktion bereitstellen, weil wir so zuversichtlich sind, dass alles bei Bedarf neu kompiliert wird.Kommt auf unsere Nerven an :)

Oracle bietet Mechanismen zum automatischen Neukompilieren aller ungültigen Objekte in einem Schema.

  • Am einfachsten ist es zu verwenden DBMS_UTILITY.COMPILE_SCHEMA().Dies ist jedoch seit 8i zweifelhaft (da die Unterstützung für gespeicherte Java-Prozeduren das Potenzial für zirkuläre Abhängigkeiten einführte) und es ist nicht mehr garantiert, dass alle Objekte beim ersten Mal erfolgreich kompiliert werden.

  • In 9i gab uns Oracle ein Skript $ORACLE_HOME/rdbms/admin/utlrp.sql die Dinge neu kompiliert haben.Leider erfordert es SYSDBA-Zugriff.

  • In 10g haben sie das Paket UTL_RECOMP hinzugefügt, das im Grunde alles tut, was dieses Skript tut.Dies ist der empfohlene Ansatz zum Neukompilieren einer großen Anzahl von Objekten.Leider erfordert es auch SYSDBA-Zugriff. Infos.

In 11g führte Oracle ein feinkörniges Abhängigkeitsmanagement ein.Dies bedeutet, dass Änderungen an Tabellen mit einer feineren Granularität (im Grunde eher auf Spaltenebene als auf Tabellenebene) ausgewertet werden und nur Objekte betroffen sind, die direkt von den Änderungen betroffen sind. Infos.

Andere Tipps

überhaupt kein großes Thema.

Klicken Sie mit der rechten Maustaste auf sie, um neu zu kompilieren, und Sie sind gut zu gehen ... Ich schreibe dies aus meiner eigenen Erfahrung.

Wenn es Fehler mit dem gerade geänderten Code gibt, werden sie angezeigt, sodass Sie es beheben können.Der Compiler sagt Ihnen, wo Probleme sind (Zeilennummern, Variablennamen usw.) bei Fehlern.

Wenn die Auslöser funktionieren, fängt es wahrscheinlich, dass Oracle einen ORA-04068-Fehler fängt, wenn er den Abzug abfeuert und den Auslöser nach dem automatisch neu komplexen REASTRY anbringt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top