Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Auslösen von Alternativen für zwei Tabellen, die sich gegenseitig aktualisieren müssen

Die Verwendung von Triggern ist hier nur ein Ärgernis.

Darüber hinaus ist die Verwendung des Planers wahrscheinlich nicht die beste Idee, da die geplanten Jobs nur festgeschriebene Daten sehen können. Entweder Sie schreiben den Trigger fest, der die Transaktionslogik aus dem Fenster wirft, oder die Änderungen an den Tabellen werden bis zum Ende der Transaktion verzögert.

Sie sollten entweder:

  1. Verwenden Sie Verfahren. Die einfachste Antwort. Wenn Sie mehrere Anwendungen haben, sollten sie die DML/Business-Logik nicht direkt ausführen, sondern immer mit Prozeduren, damit sie alle denselben Code ausführen. Direktes DML mit Grants oder Views verbieten. Möglicherweise müssen Sie die Verwendung von Prozeduren durch INSTEAD OF erzwingen Trigger auf Ansichten (berücksichtigen Sie dies nur, wenn Sie die Anwendung nicht ändern können).

  2. In Ihrem Fall wahrscheinlich sogar besser als Prozeduren:Verwenden Sie ein Schema, das keine doppelten Daten enthält. Sie wollen keine redundanten Daten speichern:Das macht die Anwendungsentwicklung komplexer als nötig. In Bezug auf Leistung, Ressourcen und Energie ist der beste Weg, ein Problem zu lösen, wenn Sie erkennen, dass die Aufgabe unnötig ist.

    Aus der Beschreibung Ihres Modells können Sie die folgenden Spalten entfernen:

    • task.duration_in_days
    • task.end_date
    • task.needs_recomputation
    • subtask.start_date
    • subtask.end_date


    Die task Tabelle würde nur das Startdatum enthalten und jede Teilaufgabe würde nur ihre Dauer speichern. Wenn Sie die aggregierten Informationen benötigen, verwenden Sie Verknüpfungen. Sie können Views verwenden, um Anwendungen transparent auf die Daten zugreifen zu lassen.

  3. Verwenden Sie eine Mutating Trigger Workaround die Paketvariablen verwendet, um geänderte Zeilen mit BEFORE zu identifizieren und AFTER Aussage auslöst. Offensichtlich wird dies eine Menge Code beinhalten, der schwer zu codieren, zu testen und zu warten ist, daher sollten Sie stattdessen die Optionen (1) und (2) verwenden, wann immer dies möglich ist.