2012-03-01 28 views
11

Tengo una tabla con 3 campos [ID, Nombre, Última actualización].
LastUpdated tiene un valor por defecto de "GetDate() de modo que se llena automáticamente cuando se agrega un nuevo registro.T-SQL Trigger Update

Cuando en lugar ejecutar una actualización en la mesa, me gustaría tener este campo reajuste en el GetDate actual .()

CREATE TRIGGER dbo.Table1_Updated 
    ON dbo.Table1 
    AFTER UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON; 
    UPDATE dbo.Table1 SET LastUpdated = GETDATE() 
END 
GO 

Pero debido a que no tengo una cláusula WHERE, todos los registros actualizarán

PREGUNTA:.
¿Dónde puedo obtener el valor del ID del registro actualizado de una UPD ATE Trigger?

¿El hecho de que estoy actualizando un campo de la tabla dentro del Trigger, vuelve a llamar a un nuevo evento Trigger (y así sucesivamente)?

+0

@Damien_The_Unbeliever seguro de entender eso, pero este hilo es sólo una muestra para mí entender el concepto. este no es el código real –

Respuesta

21

De 'INSERTED', la tabla INSERTED es común para el disparador INSERT, UPDATE.

CREATE TRIGGER dbo.Table1_Updated 
ON dbo.Table1 
FOR INSERT, UPDATE /* Fire this trigger when a row is INSERTed or UPDATEd */ 
AS BEGIN 
    UPDATE dbo.Table1 SET dbo.Table1.LastUpdated = GETDATE() 
    FROM INSERTED 
    WHERE inserted.id=Table1.id 
END 
+0

así que incluso si el TSQL solo está haciendo una ACTUALIZACIÓN en cualquier campo, dentro del disparador voy y busco la tabla virtual insertada. Por cierto, ¿tengo que poner PARA INSERTAR ... incluso si solo necesito PARA ACTUALIZAR? –

1
Update table1 
set LastUpdated = getdate() 
from inserted i, table1 a 
where i.pk1 = a.pk1 
+0

http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=57227 –