updated update trigger stored qué momento inserted from for ejemplo ejecutar desde deleted delete create crea after sql-server-2008 sql-server-2008-r2

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