sql-server-2008 - update - trigger after insert sql server
Simple Update trigger+simple row insert (2)
Novato total en disparadores ... a todos los doctores no les molestan las cosas para principiantes.
Solo quiero actualizar la (s) fila (s) que se ha / han actualizado. Mi disparador a continuación actualiza la tabla completa. El disparador a continuación solo prueba dos columnas para cambios.
¿Cómo restrinjo esta activación de actualización a la actualización solo las filas actualizadas y no toda la tabla?
ALTER TRIGGER [dbo].[geog_update] ON [dbo].[Site]
FOR UPDATE
AS
SET NOCOUNT ON
IF (UPDATE(Latitude) OR UPDATE(Longitude))
BEGIN
UPDATE Site
SET geog = geography::Point([Latitude], [Longitude], 4326)
WHERE Latitude is not null and Longitude is not null
END
¿Puedo usar el mismo activador para las filas insertadas simplemente usando FOR UPDATE, INSERT? Probablemente no, ya que el IF verifica UPDATE () en una columna, a menos que INSERT implique UPDATE.
Aquí está el gatillo final de ACTUALIZACIÓN. Hice un disparador INSERT que es casi idéntico.
CREATE TRIGGER [dbo].[geog_update] ON [dbo].[Site]
FOR UPDATE
AS
SET NOCOUNT ON
IF (UPDATE(Latitude) OR UPDATE(Longitude))
BEGIN
UPDATE t1
SET t1.geog = geography::Point(t1.Latitude, t1.Longitude, 4326)
FROM Site AS t1 INNER JOIN Inserted AS t2 ON t1.Site_ID = t2.Site_ID
WHERE (t1.Latitude IS NOT NULL)
AND (t1.Longitude IS NOT NULL)
AND (t1.Record_Archive_Date IS NULL)
END
Ok, en primer lugar, nunca bajo ninguna circunstancia diseñar un activador para actualizar solo una fila en SQL Server. Usted lo diseña para actualizar las filas que se insertaron, eliminaron o actualizaron. Los desencadenantes operan en lotes y no puede suponer que nunca cambiará más de un registro en el código que golpea la base de datos.
Para ello, únete a uno de los dos pseudotables que están disponibles solo en activadores, insertados o eliminados. Inserted contiene los nuevos registros o los valores después de una actualización, delted contiene los valores para los registros eliminados o los valores antes de que ocurra una actualización.
Podrías probar algo como:
ALTER TRIGGER [dbo].[geog_update] ON [dbo].[Site]
FOR UPDATE
AS
SET NOCOUNT ON
UPDATE S
SET geog = geography::Point(i.[Latitude], i.[Longitude], 4326)
FROM Site s
JOIN Inserted I on s.id = i.id
WHERE Latitude is not null and Longitude is not null