update trigger tabla saber para otra insertar esta ejemplos ejemplo ejecutando datos como bitacora antes sql sql-server sql-server-2005 triggers sql-update

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