Escribí un disparador para mantener un historial de actualizaciones en una tabla. Funciona bien. Sin embargo, noté que a veces la tabla se actualiza con los mismos valores exactos. Esto efectivamente no cambia la tabla, pero activa el disparador, lo que resulta en filas duplicadas en mi tabla de historial.
Para resolver esto, me gustaría ejecutar el cuerpo de mi disparador solo cuando las tablas inserted
y deleted
no son idénticas.
Aquí está mi detonante actual. Consiste en un FUSION y un INSERT. Si las tablas inserted
y deleted
son idénticas, no quiero FUSIONAR NI INSERTAR:
BEGIN
DECLARE @yesterday date, @maxDate date
SET @yesterday = DATEADD(DD, -1, GETDATE())
SET @maxDate = '9999-12-31'
MERGE dbo.tblHistory AS Target
USING (SELECT * FROM inserted) AS Source
ON (Target.ID = Source.ID AND Target.EndDate = @maxDate)
WHEN MATCHED AND Target.StartDate > @yesterday THEN
DELETE
WHEN MATCHED THEN
UPDATE
SET Target.EndDate = @yesterday
;
--Insert updated row into History here
END
Esta parece ser la forma más lógica y legible por humanos de hacerlo. Sin embargo, no estoy seguro de si es el más efectivo.
Puede verificar usando excepto el operador como a continuación
;with cte
as
(SELECT * FROM inserted
EXCEPT
SELECT * FROM deleted
union all
SELECT * FROM deleted
EXCEPT
SELECT * FROM inserted
)
select * from cte
if @@rowcount>0
begin
--rest of your query
end
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras