inserted
é uma pseudo-tabela e definitivamente contém todas as linhas corretas que foram afetadas pelo UPDATE
declaração (e eu assumo DISTINCT
não é necessário, se ID
uma chave primária - embora seja difícil dizer qual é a tabela com um nome como 121s
). Se todos eles realmente mudaram valores é outra coisa que você pode considerar validar antes de aplicar a data/hora modificada. Tirando isso, eu provavelmente faria assim: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
Se você quiser ter uma garantia 100% infalível de que todos sejam atualizados com o mesmo carimbo de data/hora (embora eu não saiba se já vi vários valores neste 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
E se você quiser garantir que a atualização ocorra apenas se, digamos, a coluna
foo
valor alterado, você poderia dizer: 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;
Esse é o padrão geral, mas se torna mais complexo se
foo
é anulável, pois o SQL Server não poderá corresponder em linhas em que um lado tenha um valor e o outro não (ou ambos não). Nesse caso você faria assim: 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)
);
Algumas pessoas dirão "Eu posso usar COALESCE ou ISNULL contra algum valor mágico" assim:
WHERE COALESCE(t.foo, 'magic') <> COALESCE(i.foo, 'magic')
...e vou avisá-lo contra isso, porque você estará constantemente procurando por algum valor mágico que não pode existir nos dados.