Klug, Trigger zu verwenden, um eine andere Tabelle zu aktualisieren?

8

Ich habe eine ObjectTabelle, die aus einem integrierten Dienst ( den ich bei Bedarf ändern kann ) aus einer anderen Datenbank ausgefüllt wird. An bestimmten Stellen müssen wir manuell Beiträge in eine andere Tabelle einfügen, ObjectObjectGroup (ObjectId, ObjectGroupId)die benötigt wird, wenn Object.ObjectTypeein bestimmter ganzzahliger Wert vorliegt. Da der Integrationsdienst diese Art von Aktualisierung nicht verarbeitet, möchte ich der Objekttabelle einen Trigger hinzufügen, der im Pseudocode wie folgt lautet:

if Object.ObjectType = 10
    begin
        if Object.ObjectNumber like '<string pattern>'
        begin
            insert into ObjectObjectGroup values...
        end
    end

Ist dieses Setup sinnvoll oder gibt es einen besseren Weg in Bezug auf die Leistung?

Benny Skogberg
quelle

Antworten:

9

Meistens Kopieren / Einfügen meiner Antwort auf diese Frage zum Stapelüberlauf

Auslöser können sehr verlockend sein. Wenn Sie sie zum ersten Mal verwenden, wirken sie wie ein Wundermittel für alle Arten von Problemen. Aber sie machen "magische" Dinge möglich. Wenn Sie die Datenbank nicht genau kennen, kann es so aussehen, als ob wirklich seltsame Dinge passieren (wie Einfügungen in andere Tabellen, Änderung der Eingabedaten usw.). Bevor ich Dinge als Auslöser implementiere, würde ich ernsthaft in Betracht ziehen, stattdessen die Verwendung einer API um das Schema herum zu erzwingen (vorzugsweise in der Datenbank, aber außerhalb, wenn Sie nicht können).

Einige Dinge, für die ich noch Trigger verwenden würde

  • Verfolgen Sie die Felder "date_created" und "date_last_edited"
  • Einfügen von "IDs" (in Oracle, wo kein Auto-ID-Feld vorhanden ist)
  • Änderungsverlauf behalten

Dinge, für die Sie keine Trigger verwenden möchten

  • Geschäftsregeln / Logik
  • alles, was außerhalb der Datenbank eine Verbindung herstellt (z. B. ein Webservice-Aufruf)
  • Zugangskontrolle
  • Alles, was nicht transaktional ist (alles, was Sie im Trigger tun, MUSS mit der Transaktion zurückgesetzt werden können)
Matthew Watson
quelle
4

Ja, es ist weise. Dies ist eigentlich der Zweck eines Triggers, um die erforderlichen Aktionen nach einem Einfüge- / Aktualisierungs- / Löschvorgang für eine Tabelle auszuführen.

Sie müssen berücksichtigen, dass ein Trigger in MS SQL nicht jede Zeile einzeln behandelt, sondern alle Zeilen der aktuellen Transaktion gleichzeitig. Wenn also eine Operation 10 Zeilen gleichzeitig einfügt, müssen Sie den Code Ihres Triggers berücksichtigen, um alle Zeilen gleichzeitig zu behandeln.

Marian
quelle
1
Solange der Dienst, der die Datenbank auffüllt, nicht alles tut, was der Mann braucht, und solange er den Dienst nicht ändern kann (das ist mein Gefühl nach der Beschreibung), und die Frage ist hier auf DBA.SE, nicht auf Programmierern Ich werde sagen, dass ein gut dokumentierter Auslöser kein Problem sein sollte. Er sagte, er mache einige Dinge manuell, so dass Codeänderungen nach meinem Verständnis nicht beteiligt sein könnten.
Marian
1
In diesem Fall ist es möglicherweise die einzig praktikable Option, die es nicht sinnvoll macht. Es ist ratsam, den Anwendungsentwickler zurückzudrängen und ihn dazu zu bringen, ihn korrekt in beide Tabellen einzufügen.
Matthew Watson
Husten . Ich sehe, wohin das führt. Tut mir leid, dass ich in meiner obigen Frage unklar bin. Ich habe die Möglichkeit, den Integrationsdienst zu ändern, auch wenn er mir nicht "gehört". Nach allem, was ich lesen kann, ist es besser, den Integrationsdienst zu ändern und nur Trigger für Prüf- / Verlaufsaufzeichnungsdienste zu verwenden.
Benny Skogberg
3

Trigger sind ein leistungsstarkes Werkzeug, und wie bei jedem anderen Werkzeug müssen Sie bei der Verwendung vorsichtig sein.

  1. Wenn Sie einen Fehler in einem Trigger machen, können die Dinge DRASTISCH schief gehen, und wenn Sie keine Spuren verfolgen, werden Sie nicht merken ...

  2. Sie ändern / fügen / löschen Daten auf magische Weise ein, die der Benutzer der Datenbank (die aktuelle Anwendung / jede zukünftige Anwendung / ein Entwickler, der ein einmaliges Update durchführt) nicht realisiert / beabsichtigt hat.

Das große Problem ist, dass es anderen Entwicklern / Benutzern nach dem Erstellen des Triggers nicht klar ist, dass ein Trigger überhaupt vorhanden ist und was er tut.

Das heißt, sie sind ein großartiges Werkzeug zur Aufrechterhaltung der Integrität Ihrer Daten und zur echten Prüfung von Änderungen.

Sie müssen sich fragen, ob die Logik, die Sie in den Trigger einfügen möchten, am besten zu den Anwendungen oder innerhalb der Datenbank passt und die Risiken auf beiden Seiten abwägt (was passiert, wenn eine neue Anwendung hinzukommt und dies nicht erzwingt) Regel?)

Andrew Bickerton
quelle