inserted
es una pseudo-tabla y definitivamente contiene todas las filas correctas que fueron afectadas por UPDATE
declaración (y asumo DISTINCT
no es necesario, si ID
una clave principal, aunque es difícil saber cuál es la tabla con un nombre como 121s
). Si todos ellos realmente habían cambiado valores es otra cosa que puede considerar validar antes de aplicar la fecha/hora modificada. Salvo eso, probablemente lo haría de esta manera:
ALTER TRIGGER [dbo].[trg_121s]
ON [dbo].[121s]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
UPDATE t SET modified = CURRENT_TIMESTAMP
FROM dbo.[121s] AS t
WHERE EXISTS (SELECT 1 FROM inserted WHERE ID = t.ID);
-- WHERE EXISTS is same as INNER JOIN inserted AS i ON t.ID = i.ID;
END
GO
Si desea tener una garantía 100 % infalible de que todos están actualizados con la misma marca de tiempo (aunque no sé si alguna vez he visto varios valores en este caso de uso):
ALTER TRIGGER [dbo].[trg_121s]
ON [dbo].[121s]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @ts DATETIME;
SET @ts = CURRENT_TIMESTAMP;
UPDATE t SET modified = @ts
FROM dbo.[121s] AS t
INNER JOIN inserted AS i
ON t.ID = i.ID;
END
GO
Y si desea asegurarse de que la actualización solo ocurra si, por ejemplo, la columna foo
valor cambiado, podría decir:
UPDATE t SET modified = @ts
FROM dbo.[121s] AS t
INNER JOIN inserted AS i
ON t.ID = i.ID
AND t.foo <> i.foo;
Ese es el patrón general, pero se vuelve más complejo si foo
es anulable, ya que SQL Server no podrá hacer coincidir las filas donde un lado tiene un valor y el otro no (o ambos no). En ese caso, harías esto:
AND
(
t.foo <> i.foo
OR (t.foo IS NULL AND i.foo IS NOT NULL)
OR (t.foo IS NOT NULL AND i.foo IS NULL)
);
Algunas personas dirán "Puedo usar COALESCE o ISNULL contra algún valor mágico" como este:
WHERE COALESCE(t.foo, 'magic') <> COALESCE(i.foo, 'magic')
...y te advertiré contra esto, porque estarás constantemente buscando algún valor mágico que no puede existir en los datos.