2009-11-17 18 views
7

Hola es posible cambiar entre los comandos DML/operaciones (Insertar, eliminar, actualizar) el cuerpo desencadenan ?, trato de algunos fragmento de código T-SQL para mí entender mejor:SQL Server gatillo conmutador Insertar, eliminar, actualizar

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 

Gracias,

Respuesta

18

Le mostraré una forma simple de verificar esto en SQL Server 2000 o 2005 (olvidó mencionar qué versión está usando), pero en general estoy de acuerdo con Remus en que debe dividirlos en desencadenantes separados:

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 

Tenga en cuenta que esto puede no ser compatible con visión de la perfección debido a la complejidad MERGE introduce en SQL Server 2008. Ver este artículo Connect para obtener más información: http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=321930

Así que si usted está planeando utilizar SQL Server 2008 y MERGE en el futuro, esta es una razón más para dividir el gatillo en un disparador para cada tipo de operación DML.

+0

+1 para "más razones para dividir el disparador". Eso realmente ahorró mucho tiempo y solo 'sentido lógico': ¿por qué molestarse con toda la basura para descubrir qué se necesita hacer cuando los factores desencadenantes por separado también hacen el trabajo bien? Gracias @ Aaron. –

6

puede tener tres disparadores separados, uno para INSERT uno para actualizar uno de eliminar. Como cada activador es diferente, no hay necesidad de lógica de conmutación.

3

Creo que la forma general de hacer esto es crear un disparador para cada acción, así:

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

Puede utilizar el inserted and deleted tables para ver qué cambios se hicieron a la mesa.

Para una ACTUALIZACIÓN, la tabla deleted contiene la versión anterior de la fila y inserted la nueva versión.

ELIMINAR e INSERTAR utilizan su propia tabla como era de esperar.

Cuestiones relacionadas