sql >> Base de Datos >  >> RDS >> Sqlserver

Activar y actualizar una fila en SQL Server después de que se haya actualizado

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.