2008-09-18 22 views
25

Kann jemand wissen, wie SQL Server die Reihenfolge Trigger (des gleichen Typs, d. H. Vor Trigger) ausgeführt werden. Und gibt es eine Möglichkeit, dies zu ändern, so dass ich die Reihenfolge angeben kann, die ich möchte. Wenn nicht, warum nicht.SQL Server-Trigger - Reihenfolge der Ausführung

Danke.

Antwort

2

Die Reihenfolge wird von SQL Server festgelegt, das einzige, was Sie tun können, ist ein System sp (sp_settriggerorder), um festzulegen, welcher Auslöser zuerst ausgelöst wird und welcher zuletzt ausgelöst wird.

Neben dem Festlegen des ersten und letzten Auslösers können Sie auch nicht ändern oder angeben, welche Reihenfolge der SQL Server verwenden soll. Daher sollten Sie Ihre Trigger so aufbauen, dass sie sich nicht darauf verlassen, in welcher Reihenfolge sie ausgelöst werden. Selbst wenn Sie die Reihenfolge bestimmen, in der sie heute feuern, kann sich das morgen ändern.

Diese Information basiert auf Sql Server 2000, aber ich glaube nicht, 2005/2008 in dieser Hinsicht anders handeln.

4

Verwenden Sie sp_Settriggerorder gespeicherte Prozedur, können Sie die Ausführungsreihenfolge des Triggers definieren.

Der zweite Parameter "order" kann drei Werte annehmen, was bedeutet, dass er bis zu drei Trigger berücksichtigen kann.

  1. Erste - Auslöser ist
  2. Letzte zuerst gefeuert - Auslöser ist zuletzt
  3. Keine gefeuert - Auslöser in zufälliger Reihenfolge abgefeuert wird.
1

Mit diesem System gespeicherte Prozedur:

sp_settriggerorder[@triggername = ] 'triggername', [@order = ] 'value', [@stmttype = ] 'statement_type' 
5

sp_settriggerorder gilt nur für AFTER-Trigger.

4

Sie können garantieren, welcher Trigger zuerst ausgelöst wird, welcher Trigger zuletzt ausgelöst wird und welche in der Mitte ausgelöst werden, indem sp_settriggerorder verwendet wird. Wenn Sie mehr als drei synchronisieren müssen, scheint es in SQL Server 2005 nicht möglich.

Hier ist ein Beispiel aus here (der verknüpfte Artikel enthält viel mehr Informationen).

sp_settriggerorder [ @triggername = ] ‘[ triggerschema. ] triggername’ 
, [ @order = ] ‘value’ 
, [ @stmttype = ] ’statement_type’ 
[ , [ @namespace = ] { ‘DATABASE’ | ‘SERVER’ | NULL } ] 
10

Wenn Ihr an der Stelle der Sorgen über Trigger-Aufträge dann wirklich Sie einen Schritt zurück zu nehmen und überlegen, was Sie versuchen, es zu tun, und wenn es einen besseren Weg, es zu tun. Die Tatsache, dass dies nicht leicht zu ändern ist, sollte Ihnen etwas sagen.

Trigger sehen immer wie eine echte saubere Lösung, und an der richtigen Stelle sind sie sehr wertvoll, aber der Preis ist hoch, es ist wirklich einfach Debuggen Alpträume mit ihnen zu erstellen. Ich habe in der Vergangenheit viele Stunden verloren und versucht, ein obskures Datenbankverhalten zu debuggen, nur um herauszufinden, dass die Ursache in einem übersehenen Auslöser steckt.

17

Mit SetTriggerOrder ist in Ordnung, aber wenn Ihr Code auf einer bestimmten Reihenfolge der Ausführung abhängt, warum nicht wickelt alle Ihre Trigger in Stored Procedures und hat den ersten Aufruf an den zweiten, ruft die zweiten die dritten usw.

Dann haben Sie einfach die erste im Trigger ausführen.

Jemand in der Zukunft wird dankbar sein, dass sie nicht in einer Systemtabelle herumkramen mussten, um eine benutzerdefinierte Ausführungssequenz zu bestimmen.

+7

Im Allgemeinen tun wir dies nicht, weil wir keinen einfachen Zugriff auf die eingefügten und gelöschten Pseudotabellen in gespeicherten Prozeduren haben. – mwigdahl

+0

Die Ausführungsreihenfolge kann ohne Abhängigkeit interessant sein ... – Paul

14

Sie können sp_settriggerorder verwenden, um die Reihenfolge jedes Triggers für eine Tabelle zu definieren.

Allerdings würde ich argumentieren, dass Sie viel besser dran wäre mit einem einzigen Auslöser, der mehrere Dinge tut. Dies ist insbesondere also, wenn die Reihenfolge wichtig ist, da diese Bedeutung nicht sehr offensichtlich ist, wenn Sie mehrere Trigger haben. Stellen Sie sich vor, jemand versucht, die Datenbank Monate/Jahre auf der ganzen Strecke zu unterstützen. Natürlich gibt es Fälle, in denen Sie mehrere Auslöser haben müssen, oder es ist wirklich ein besseres Design, aber ich würde davon ausgehen, dass Sie einen haben und von dort aus arbeiten sollten.

1

Eine Million Dollar Aussage in diesem Zusammenhang -

sp_settriggerorder: Gibt die AFTER-Trigger, die erste oder zuletzt abgefeuert werden. Die AFTER-Trigger, die zwischen dem ersten und dem letzten Trigger ausgelöst werden, werden in nicht definierter Reihenfolge ausgeführt.

Quelle: MSDN

2

Verwendung Dieser:

Zum Beispiel:

USE AdventureWorks; 
GO 
EXEC sys.sp_settriggerorder @triggername = N'', -- nvarchar(517) 
    @order = '', -- varchar(10) 
    @stmttype = '', -- varchar(50) 
    @namespace = '' -- varchar(10) 

Die erste und letzte Auslöser müssen zwei verschiedene Auslöser sein.

Zuerst: Trigger wird zuerst ausgelöst.

Zuletzt: Auslöser wird zuletzt ausgelöst.

Keine: Der Trigger wird in nicht definierter Reihenfolge ausgelöst.

Und siehe diesen Link für den Wert des @stmttype: DDL Events

Und für @namespace = { 'DATABASE' | 'SERVER' | NULL} und für weitere Informationen siehe: DDL Triggers

Verwandte Themen