Tengo un activador de tabla en ACTUALIZAR e INSERTAR que agrega una fila a otra tabla. Solo necesita agregar una fila si se cambia una de las cuatro columnas. Intenté usar IF UPDATE (col) para probar los cambios, pero tiene un punto ciego. Solo prueba que entró algún valor. Necesito ir más profundo, necesito comparar los valores antiguos y nuevos para ver que se ha producido un verdadero cambio. Tiene que trabajar con INSERTAR y ACTUALIZAR.
En el caso de una ACTUALIZACIÓN, eso es fácil porque las tablas insertadas y eliminadas tienen valores que puedo comparar dentro del activador. Sin embargo, para INSERTAR solo la tabla de inserción tiene valores. Como necesito todo esto en el mismo disparador, ¿cómo manejo ese caso INSERT?
Aquí está la secuencia de comandos del desencadenador que quiero modificar:
ALTER TRIGGER [dbo].[trATPerson_alter]
ON [mydb].[dbo].[AT_Person]
AFTER INSERT,UPDATE
AS
BEGIN
SET NOCOUNT ON;
-- Not all updates require a push
IF (UPDATE([First_Name]) OR UPDATE([Last_Name]) OR UPDATE([JobCode]) OR UPDATE([Inactive]))
BEGIN
INSERT INTO [mydb].[dbo].[AT_Person_To_Push] (
[Facility],
[VendorID],
[Person_code],
[First_Name],
[Last_Name],
[JobCode],
[Alink],
[Inactive]
)
SELECT [Facility],
[VendorID],
[Person_code],
[First_Name],
[Last_Name],
[JobCode],
[Alink],
[Inactive]
FROM inserted
END
END
Respuestas:
Puede manejar INSERTAR y ACTUALIZAR con un operador de conjunto EXCEPTO. EXISTS solo se evaluará como VERDADERO si es solo un INSERT, o si es una ACTUALIZACIÓN con valores diferentes para cualquiera de estas columnas.
fuente
EXISTS
verifica que cualquier fila haya cambiado. Si mantiene el inserto de la pregunta, luego registrará todas las filas actualizadas cuando solo una cambie de manera significativa.En caso de que una actualización pueda afectar varias filas, debe protegerse contra dos cosas:
AT_Person_To_Push
. Si se actualizan 5 filas, pero solo 2 se actualizan de una manera que nos interesa, entonces necesitamos procesar solo las 2 filas relevantes.Así es como lo manejaría:
inserted
a ladeleted
, porqueinserted
tendrá filas para inserciones y actualizaciones, mientrasdeleted
que solo tendrá filas para actualizaciones.EXISTS
conEXCEPT
para buscar filas donde losinserted
valores difieran de losdeleted
valores. No se puede usari.First_Name != d.First_Name OR i.Last_Name != d.Last_Name...
porque la tabla eliminada estará vacía (y la IZQUIERDA IZQUIERDA devolverá nulos) cuando el activador maneja un INSERT.AT_Person_To_Push
.fuente
Prueba esto,
fuente