2011-06-02 12 views
8

Tengo una tabla Product y otra tabla ProductLog.SQL Server desencadenar en insertar, eliminar y actualizar en la tabla

La tabla de registro necesita rastrear dos columnas en la tabla Product. Cada vez que hay una inserción, actualización o eliminación en esas columnas, necesito actualizar la tabla de registro.

¿Necesito escribir tres disparos por separado, o puede uno disparar manejar estas operaciones?

También necesito saber el tipo de operación, por ejemplo, necesitaré saber si la entrada en la tabla de registro fue por inserción o eliminación o actualización. Si alguien me da un ejemplo, sería genial.

Respuesta

24

que necesita sólo un disparador

CREATE TRIGGER [ProductAfter] ON [Product] AFTER INSERT, UPDATE, DELETE 

Puede determinar qué instrucción DML dispara el gatillo función del número de registros en inserted y deleted mesas disponibles dentro del cuerpo del disparador. Para INSERT, deleted está vacío, DELETE, inserted está vacío, UPDATE ambos inserted y deleted no están vacíos. Por ejemplo,

IF @@ROWCOUNT = 0 -- exit trigger when zero records affected 
BEGIN 
    RETURN; 
END; 
DECLARE @type CHAR(1);-- 'U' for update, 'D' for delete, 'I' for insert 
IF EXISTS(SELECT * FROM inserted) 
BEGIN 
    IF EXISTS(SELECT * FROM deleted) 
    BEGIN 
    SET @type ='U'; 
    END 
    ELSE 
    BEGIN 
    SET @type ='I'; 
    END 
END 
ELSE 
BEGIN 
    SET @type = 'D'; 
END; 

También, echar un vistazo en Tracking Data Changes, no hay otra opción para el seguimiento de los cambios sin factores desencadenantes.

6

o simplemente

DECLARE @type CHAR(1)= 
    case when not exists(SELECT * FROM inserted) 
     then 'D' 
    when exists(SELECT * FROM deleted) 
     then 'U' 
    else 
     'I' 
    end 
+0

Tengo mismo problema alguien me puede ayudar. Vea el siguiente enlace http://stackoverflow.com/questions/26043106/how-to-determine-if-insert-or-update/26043654#26043654 – Prathyush

Cuestiones relacionadas