2009-11-17 13 views
7

Ciao è possibile passare da DML comandi/operazioni (inserimento, cancellazione, aggiornamento) sul grilletto corpo ?, cerco di frammento qualche T-SQL per me capire meglio:SQL Server trigger commutazione Insert, Delete, 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 

Grazie,

risposta

18

Vi mostrerò un modo semplice per controllare questo in SQL Server 2000 o 2005 (avete dimenticato di menzionare quale versione state usando), ma in generale sono d'accordo con Remus sul fatto che dovreste suddividerli in trigger separati:

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 

si noti che questo potrebbe non essere compatibile previsionali perfettamente a causa della complessità MERGE introduce in SQL Server 2008. Vedere questa voce Connect per ulteriori informazioni: http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=321930

Quindi, se si prevede di utilizzare SQL Server 2008 e MERGE in futuro, quindi questa è una ragione in più per dividere il trigger in un trigger per ogni tipo di operazione DML.

+0

+1 per "motivo in più per dividere il trigger su". Ciò ha davvero risparmiato molto tempo e solo un po 'di "senso" - perché preoccuparsi di tutte le stronzate per capire cosa deve essere fatto, quando trigger separati funzionano egualmente. Grazie @Aaron. –

6

si possono avere tre inneschi separati, uno per uno per INSERT UPDATE uno per eliminare. Poiché ciascun trigger è diverso, non è necessario utilizzare la logica dell'interruttore.

3

Penso che il modo generale per farlo è quello di creare un trigger per ogni azione, in questo modo:

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

È possibile utilizzare la inserted and deleted tables per vedere quali modifiche sono state apportate alla tabella.

Per un UPDATE, la tabella deleted contiene la versione precedente della riga e inserted la nuova versione.

DELETE e INSERT utilizzano la propria tabella come ci si aspetterebbe.

Problemi correlati