Frage

ich habe ein Object Tabelle, die aus einem integrierten Dienst besiedelt ist (was ich bei Bedarf ändern kann) aus einer anderen Datenbank. An bestimmten Stellen müssen wir Beiträge in einer anderen Tabelle manuell hinzufügen ObjectObjectGroup (ObjectId, ObjectGroupId) Welches wird benötigt, wenn Object.ObjectType einen bestimmten ganzzahligen Wert haben. Da der Integrationsdienst diese Art von Update nicht behandelt, denke ich darüber nach, der Objekttabelle einen Auslöser hinzuzufügen, der in Pseudo-Code das folgende wäre:

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

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

War es hilfreich?

Lösung

Meistens kopieren/einfügen meine Antwort daraus Frage auf Stackoverflow

Auslöser können sehr verlockend sein. Wenn Sie sie zum ersten Mal verwenden, scheinen sie für alle möglichen Probleme wie eine magische Kugel zu sein. Aber sie machen "magische" Dinge, wenn Sie die Datenbank von innen nach außen nicht kennen, es kann wirklich seltsam erscheinen (z. B. Einfügen in andere Tabellen, Eingabedaten usw.). Bevor ich Dinge als Auslöser implementieren würde, würde ich ernsthaft in Betracht ziehen, stattdessen die Verwendung einer API rund um das Schema durchzusetzen (vorzugsweise in der Datenbank, aber außerhalb, wenn Sie dies nicht können).

Einige Dinge, für die ich immer noch Auslöser verwenden würde

  • Verfolgen Sie die Felder "Date_Created" und "Date_Last_edited"
  • Einfügen von "ID" (ID "(in Oracle, wo es kein automatisches ID -Feld gibt)
  • Veränderungsgeschichte halten

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

  • Geschäftsregeln/Logik
  • Alles, was sich außerhalb der Datenbank verbindet (z. B. ein WebService -Anruf)
  • Zugangskontrolle
  • Alles, was nicht transaktional ist (alles, was Sie im Auslöser tun, muss in der Lage sein, mit der Transaktion zu rollen)

Andere Tipps

Ja, es ist weise. Dies ist der Zweck eines Auslösers, um die erforderlichen Aktionen nach einem Einfügen/Update-/Löschen von Operation auf einer Tabelle auszuführen.

Sie müssen die Tatsache berücksichtigen, dass ein Auslöser in MS SQL nicht jede Zeile separat behandelt, sondern alle Zeilen der aktuellen Transaktion gleichzeitig verarbeitet. Wenn ein Operation 10 Zeilen gleichzeitig einfügt, müssen Sie den Code Ihres Triggers denken, um alle Zeilen gleichzeitig zu behandeln.

Auslöser sind ein leistungsstarkes Werkzeug, und wie jedes andere Werkzeug müssen Sie bei der Verwendung vorsichtig sein.

  1. Wenn Sie einen Fehler in einem Auslöser machen, können Dinge drastisch schief gehen, und wenn Sie keine Spuren ausführen, werden Sie nicht merken ...

  2. Sie führen Daten aus, die Daten ändern/einfügen/löschen/löschen, die der Benutzer der DB (die aktuelle Anwendung/eine zukünftige Anwendung/ein Entwickler, die ein Off -Update durchführen) nicht realisiert/beabsichtigt.

Das große Problem ist, dass es für andere Entwickler/Benutzer, nachdem Sie den Auslöser erstellt haben, nicht offensichtlich ist, dass ein Trigger sogar da ist und was er tut.

Sie sind jedoch ein großartiges Instrument 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 Auslöser einfügen möchten Regel?)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top