Insertar activador de actualización cómo determinar si insertar o actualizar
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?
Los activadores tienen tablas especiales INSERTED
para DELETED
rastrear 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 DELETED
la 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 INSERTED
desencadenantes UPDATED
.
Obviamente, los activadores DELETE no pueden tener "siempre filas INSERTED
" como dije anteriormente
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
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.