Frage

Pretty allgemeine Frage bezüglich Trigger in SQL Server 2005.

In welchen Situationen sind Tabelle Trigger gefeuert und welche Situationen nicht wahr?

Jede Codebeispiele wäre toll, zu demonstrieren.

Ich schreibe eine Prüfung basierte Datenbanken und wollen nur Kenntnis von Situationen, die nicht die Auslöser abfeuern könnte, die ich für die Aktualisierung einrichten, löschen und einfügen auf meine Tabellen.

Ein Beispiel dafür, was ich meine,

UPDATE MyTable SET name = 'test rows' WHERE id in (1, 2, 3);

Die folgende Anweisung nur löst die Update-Trigger einmal.

War es hilfreich?

Lösung

Wenn Sie wünschen, sie zu feuern?

CREATE TRIGGER AFTER ACTION

Das läuft nach der Aktion (insert update delete) begangen werden. INSTEAD OF feuert den Auslöser anstelle der Aktion.

Einer der größten Fallstricke mit Auslöser ist, dass sie feuern, wenn eine Aktion ausgeführt wird, auch wenn keine Zeilen betroffen . Dies ist kein Fehler, und es ist etwas, das man ziemlich schnell brennen können, wenn Sie nicht vorsichtig sind.

Auch mit Trigger, werden Sie die inserted und deleted Tabellen. Aktualisiert Zeilen in beide aufgeführt. Dies wirft eine Menge Leute weg, weil sie nicht benutzt werden um eine update als delete dann insert zu denken.

Die MSDN-Dokumentation hat eigentlich eine ziemlich in die Tiefe gehende Diskussion darüber, wann löst Feuer und welche Wirkung sie haben hier .

Andere Tipps

2008 können Sie in Change Data Capture

Es gibt auch eine ganze Reihe von Situationen, in denen Trigger nicht ausgelöst, wie zum Beispiel:

· Eine Tabelle gelöscht wird.

· Eine Tabelle abgeschnitten wird.

· Einstellungen für verschachtelten und / oder rekursive Trigger verhindern, dass ein Trigger von Brennen.

· Daten sind bulk geladen, unter Umgehung Trigger.

  

Die folgende Anweisung nur löst die Update-Trigger einmal.

Jede Aussage Aktion Typ feuert nur den Auslöser einmal ganz gleich, wie viele Zeilen betroffen sind, Trigger geschrieben werden müssen mehrreihige Einsätze / updates / löscht zu behandeln.

Wenn Ihr Auslöser ist abhängig von nur eine Zeile zu einem Zeitpunkt in dem eingefügt oder gelöscht pseudotables ist, wird es scheitern. Und schlimmer noch, es wird nicht mit einem Fehler fehlschlagen, wird es einfach beeinflussen nicht alle Zeilen, die Sie durch folgende Faktoren beeinträchtigt werden sollen, was auch immer der Auslöser der Fall ist. Nicht durch eine Schleife oder einen Cursor in einem Trigger dieses Problem beheben, um Set-basierte Logik zu ändern. Ein Cursor in einem Trigger kann Ihre gesamte App zum Stillstand während einer Transaktion von 500.000 Datensätze Prozessen bringen und die Tabelle für Stunden sperrt.

Großeinsätze durch Pass löst, wenn Sie sie verwenden angeben. Beachten Sie dies, weil, wenn Sie es zulassen, indem Sie den Auslöser passieren Sie Code benötigt, um sicherzustellen, dass, was auch immer in dem Trigger geschieht, geschieht auch nach dem Masseneinsatz. Oder Sie brauchen, um die Bulk-Einsätze mit der Option FIRE_TRIGGERS nennen.

Ich dachte, ich von der Verbindung hervorheben würde Eric eine Situation geschrieben, in dem ein Abzug würde nicht Feuer:

  

Obwohl eine TRUNCATE TABLE-Anweisung ist in der Tat einer DELETE, kann es keinen Trigger aktivieren, da der Vorgang nicht einzelne Zeilenlöschungen nicht einloggen. Allerdings nur diejenigen mit Berechtigungen für eine Tabelle muss ein TRUNCATE TABLE auszuführen besorgt über versehentlich einen DELETE-Trigger mit einer TRUNCATE TABLE-Anweisung zu umgehen.

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