Wann löst Feuer aus und wann nicht?

8

Sehr allgemeine Frage bezüglich Triggern in SQL Server 2005.

In welchen Situationen werden Tabellenauslöser ausgelöst und welche Situationen gibt es nicht?

Alle Codebeispiele zum Vorführen wären großartig.

Ich schreibe eine prüfungsbasierte Datenbank und möchte nur auf Situationen achten, in denen die Auslöser, die ich für das Aktualisieren, Löschen und Einfügen in meine Tabellen eingerichtet habe, nicht ausgelöst werden könnten.

Ein Beispiel dafür, was ich meine,

%Vor%

Die folgende Anweisung löst den Aktualisierungstrigger nur einmal aus.

    
Nathan W 09.08.2009, 05:46
quelle

4 Antworten

16

Wann sollen sie schießen?

%Vor%

Dies wird ausgeführt, nachdem die Aktion ( insert update delete ) festgeschrieben wurde. INSTEAD OF löst den Trigger anstelle der Aktion aus.

Einer der größten Fehler mit Triggern ist, dass sie ausgelöst werden, wenn eine Aktion ausgeführt wird, , auch wenn keine Zeilen betroffen sind . Dies ist kein Fehler, und es ist etwas, das Sie ziemlich schnell verbrennen kann, wenn Sie nicht vorsichtig sind.

Auch bei Triggern verwenden Sie die Tabellen inserted und deleted . Aktualisierte Zeilen sind in beiden aufgelistet. Das wirft viele Leute aus, weil sie nicht daran gewöhnt sind, über update als delete dann insert nachzudenken.

Die MSDN-Dokumentation enthält eine ziemlich ausführliche Diskussion darüber, wann Trigger ausgelöst werden und welche Auswirkungen sie haben hier .

    
Eric 09.08.2009, 05:51
quelle
5

Auf 2008 können Sie Datenerfassung ändern

verwenden

Es gibt auch einige Situationen, in denen Trigger nicht ausgelöst werden, wie zum Beispiel:

· Eine Tabelle wird gelöscht.

· Eine Tabelle wird abgeschnitten.

· Einstellungen für verschachtelte und / oder rekursive Trigger verhindern das Auslösen eines Triggers.

· Daten werden in großen Mengen geladen, Trigger werden umgangen.

    
A-K 09.08.2009 21:52
quelle
3
  

Die folgende Anweisung löst den Aktualisierungstrigger nur einmal aus.

Jede Aktionstypanweisung löst den Trigger nur einmal aus, unabhängig davon, wie viele Zeilen betroffen sind. Trigger müssen geschrieben werden, um mit mehrzeiligen Einfügungen / Aktualisierungen / Löschungen umzugehen.

Wenn Ihr Trigger davon abhängt, dass sich nur jeweils eine Zeile in den eingefügten oder gelöschten Pseudotabellen befindet, schlägt er fehl. Und schlimmer noch, es wird nicht mit einem Fehler fehlschlagen, es wird sich nicht auf alle Zeilen auswirken, die von dem beeinflusst werden, was auch immer der Auslöser tut. Beheben Sie dies nicht durch eine Schleife oder einen Cursor in einem Trigger, sondern ändern Sie die Einstellung auf die Set-basierte Logik. Ein Cursor in einem Auslöser kann Ihre gesamte App zum Stillstand bringen, während eine Transaktion von 500.000 Datensätzen die Tabelle für Stunden verarbeitet und blockiert.

Bulk-Insert-by-Pass-Trigger, sofern Sie nicht angeben, sie zu verwenden. Seien Sie sich dessen bewusst, denn wenn Sie den Trigger passieren lassen, benötigen Sie einen Code, um sicherzustellen, dass alles, was im Trigger passiert, auch nach der Masseneinfügung passiert. Oder Sie müssen die Bulk-Einsätze mit der Option FIRE_TRIGGERS aufrufen.

    
HLGEM 10.08.2009 21:00
quelle
2

Ich dachte, ich würde aus dem Link hervorheben, dass Eric eine Situation gepostet hat, in der ein Auslöser nicht ausgelöst wurde:

  

Obwohl eine TRUNCATE TABLE-Anweisung in Wirklichkeit DELETE ist, kann sie keinen Trigger aktivieren, da die Operation keine Löschungen einzelner Zeilen protokolliert. Jedoch müssen nur diejenigen mit Berechtigungen für eine Tabelle, um eine TRUNCATE TABLE auszuführen, besorgt sein, versehentlich einen DELETE-Trigger mit einer TRUNCATE TABLE-Anweisung zu umgehen.

    
Cory 09.08.2009 08:12
quelle