trigger - La consulta de SQL Update está causando dos filas en un desencadenador
trigger update sql (2)
Uso SQL Server 2005 y tengo la siguiente pregunta:
En una table A
, tengo un disparador que rastrea cualquier inserción / actualización / eliminación en él. Los registros rastreados se insertan en una tabla de auditoría ( aAudit
). Cuando ejecuto una actualización en A
, veo dos filas en la tabla de auditoría para cada actualización, que no es lo que esperaba. Aquí está el disparador que he definido:
ALTER TRIGGER [ATrigger] ON [dbo].[A]
FOR INSERT, UPDATE, DELETE
AS
INSERT INTO [dbo].[aAudit]
([BusinessDate], [DataTypeId], [BookId], [Version], [DelFlag], [AuditDate], [ExtStatus])
SELECT [BusinessDate], [DataTypeId], [BookId], [Version], ''N'', getDate(), 0
FROM inserted
INSERT INTO [dbo].[aAudit]
([BusinessDate], [DataTypeId], [BookId], [Version], [DelFlag], [AuditDate], [ExtStatus])
SELECT [BusinessDate], [DataTypeId], [BookId], [Version], ''Y'', getDate(), 0
FROM deleted
¿Por qué el desencadenante anterior resulta en una fila con DelFlag = ''Y''
y una fila con DelFalg = ''N''
en la tabla de auditoría?
Gracias por echar un vistazo a mi pregunta.
Vikram
Detrás de escena, una ACTUALIZACIÓN se trata como ELIMINAR la fila anterior e INSERTAR una nueva fila. Entonces cuando haces una actualización, los conjuntos de registros INSERTADOS y ELIMINADOS contienen datos.
Es por eso que dos filas ingresan en su tabla de auditoría desde una instrucción UPDATE.
Para separar las tres operaciones INSERT, UPDATE, DELETE, debe hacer comprobaciones adicionales:
ALTER TRIGGER [ATrigger] ON [dbo].[A]
FOR INSERT, UPDATE, DELETE
AS
-- those are true INSERTs - the (ID) as primary key is *not* present in the "Deleted" table
INSERT INTO [dbo].[aAudit]([BusinessDate], [DataTypeId], [BookId], [Version], [DelFlag], [AuditDate], [ExtStatus])
SELECT [BusinessDate], [DataTypeId], [BookId], [Version], ''N'', getDate(), 0
FROM inserted
WHERE (id) NOT IN (SELECT DISTINCT (id) FROM DELETED)
-- those are true DELETEs - the (ID) as primary key is *not* present in the "Inserted" table
INSERT INTO [dbo].[aAudit]([BusinessDate], [DataTypeId], [BookId], [Version], [DelFlag], [AuditDate], [ExtStatus])
SELECT [BusinessDate], [DataTypeId], [BookId], [Version], ''Y'', getDate(), 0
FROM deleted
WHERE (id) NOT IN (SELECT DISTINCT (id) FROM INSERTED)
-- those are the UPDATEs - the (ID) as primary key is present in both the "Inserted" and "Deleted" table
INSERT INTO [dbo].[aAudit]([BusinessDate], [DataTypeId], [BookId], [Version], [DelFlag], [AuditDate], [ExtStatus])
SELECT [BusinessDate], [DataTypeId], [BookId], [Version], ''N'', getDate(), 0
FROM Inserted i
INNER JOIN Deleted d on i.ID = d.ID