Insertar activador de actualización cómo determinar si insertar o actualizar

Resuelto MSIL asked hace 15 años • 23 respuestas

Necesito escribir un activador de inserción y actualización en la tabla A que eliminará todas las filas de la tabla B cuya columna (digamos Desc) tenga valores como el valor insertado/actualizado en la columna de la tabla A (digamos Col1). ¿Cómo haría para escribirlo para poder manejar los casos de Actualización e Insertar? ¿Cómo puedo determinar si el activador se ejecuta para una actualización o inserción?

MSIL avatar Apr 12 '09 14:04 MSIL
Aceptado

Los activadores tienen tablas especiales INSERTEDpara DELETEDrastrear los datos "antes" y "después". Entonces puedes usar algo como IF EXISTS (SELECT * FROM DELETED)para detectar una actualización. Solo tienes filas en DELETEDla actualización, pero siempre hay filas en INSERTED.

Busque "insertado" en CREAR DISPARADOR .

Editar, 23 de noviembre de 2011

Después del comentario, esta respuesta es solo para INSERTEDdesencadenantes UPDATED.
Obviamente, los activadores DELETE no pueden tener "siempre filas INSERTED" como dije anteriormente

gbn avatar Apr 12 '2009 08:04 gbn
CREATE TRIGGER dbo.TableName_IUD
ON dbo.TableName
AFTER INSERT, UPDATE, DELETE
AS 
BEGIN
    SET NOCOUNT ON;

    --
    -- Check if this is an INSERT, UPDATE or DELETE Action.
    -- 
    DECLARE @action as char(1);

    SET @action = 'I'; -- Set Action to Insert by default.
    IF EXISTS(SELECT * FROM DELETED)
    BEGIN
        SET @action = 
            CASE
                WHEN EXISTS(SELECT * FROM INSERTED) THEN 'U' -- Set Action to Updated.
                ELSE 'D' -- Set Action to Deleted.       
            END
    END
    ELSE 
        IF NOT EXISTS(SELECT * FROM INSERTED) RETURN; -- Nothing updated or inserted.

    ...

    END
net_prog avatar Sep 15 '2011 11:09 net_prog

Muchas de estas sugerencias no se tienen en cuenta si ejecuta una declaración de eliminación que no elimina nada.
Supongamos que intenta eliminar un ID que equivale a algún valor que no existe en la tabla.
Aún se llama a su activador, pero no hay nada en las tablas Eliminadas o Insertadas.

Utilice esto para estar seguro:

--Determine if this is an INSERT,UPDATE, or DELETE Action or a "failed delete".
DECLARE @Action as char(1);
    SET @Action = (CASE WHEN EXISTS(SELECT * FROM INSERTED)
                         AND EXISTS(SELECT * FROM DELETED)
                        THEN 'U'  -- Set Action to Updated.
                        WHEN EXISTS(SELECT * FROM INSERTED)
                        THEN 'I'  -- Set Action to Insert.
                        WHEN EXISTS(SELECT * FROM DELETED)
                        THEN 'D'  -- Set Action to Deleted.
                        ELSE NULL -- Skip. It may have been a "failed delete".   
                    END)

Un agradecimiento especial a @KenDog y @Net_Prog por sus respuestas.
Construí esto a partir de sus guiones.

MikeTeeVee avatar Jun 07 '2012 08:06 MikeTeeVee