2009-11-17 14 views
7

Hallo ist möglich, zwischen DML wechseln Befehle/Operationen (Einfügen, Löschen, Update) auf Trigger-Körper ?, Ich versuche, besser, einige T-SQL für mich verstehen Snippet:SQL Server-Trigger-Schalt Einfügen, Löschen, Update

CREATE TRIGGER DML_ON_TABLEA 
    ON TABLEA 
    AFTER INSERT,DELETE,UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    CASE 
    WHEN (INSERT) THEN 
     -- INSERT ON AUX TABLEB 
    WHEN (DELETE) THEN 
     -- DELETE ON AUX TABLEB 
    ELSE --OR WHEN (UPDATE) THEN 
     -- UPDATE ON AUX TABLEB 
    END 
END 
GO 

Danke,

Antwort

18

Ich zeige Ihnen eine einfache Möglichkeit, dies in SQL Server 2000 oder 2005 zu überprüfen (Sie vergessen zu erwähnen, welche Version Sie verwenden), aber im Allgemeinen stimme ich mit Remus, dass Sie diese in separate Trigger aufteilen sollten:

DECLARE @i INT, @d INT; 
SELECT @i = COUNT(*) FROM inserted; 
SELECT @d = COUNT(*) FROM deleted; 
IF @i + @d > 0 
BEGIN 
    IF @i > 0 AND @d = 0 
     -- insert 
    IF @i > 0 AND @d > 0 
     -- update 
    IF @i = 0 AND @d > 0 
     -- delete 
END 

Beachten Sie, dass diese nicht perfekt voraus kompatibel sein können aufgrund der Komplexität MERGE führt in SQL Server 2008 finden Sie diesen Artikel Connect für weitere Informationen: http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=321930

Also, wenn Sie planen, SQL Server 2008 zu verwenden, und MERGE in der Zukunft, dann ist das noch mehr Grund, den Trigger in einen Trigger für zu teilen jede Art von DML-Operation.

+0

+1 für "mehr Grund, den Auslöser aufzuspalten". Das hat wirklich viel Zeit gespart und einfach "made-sense" gemacht - warum sollte man sich mit all dem Mist beschäftigen, um herauszufinden, was getan werden muss, wenn separate Trigger die Aufgabe genauso gut erledigen. Danke @Aaron. –

6

Sie drei verschiedene Auslöser haben kann, einen für INSERT einer für für DELETE ein UPDATE. Da jeder Trigger unterschiedlich ist, ist keine Schaltlogik erforderlich.

3

Ich denke, die allgemeine Art und Weise, dies zu tun, ist ein Trigger für jede Aktion zu erstellen, etwa so:

CREATE TRIGGER INSERT_ON_TABLEA 
ON TABLEA 
AFTER INSERT 
AS 
BEGIN  
SET NOCOUNT ON;  
-- INSERT ON AUX TABLEB 
END 
GO 

CREATE TRIGGER DELETE_ON_TABLEA 
ON TABLEA 
AFTER DELETE 
AS 
BEGIN  
SET NOCOUNT ON;  
-- DELETE ON AUX TABLEB 
END 
GO 
7

Sie die inserted and deleted tables verwenden können, um zu sehen, welche Änderungen an der Tabelle vorgenommen wurden.

Für ein UPDATE enthält die Tabelle deleted die alte Version der Zeile und inserted die neue Version.

DELETE und INSERT verwenden ihre eigene Tabelle, wie Sie es erwarten würden.

Verwandte Themen