Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Acionar e atualizar para uma linha no SQL Server após a atualização


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.