sql >> Database >  >> RDS >> Sqlserver

Trigger en update naar een rij in SQL Server nadat deze is bijgewerkt

inserted is een pseudo-tabel en het bevat zeker alle juiste rijen die zijn beïnvloed door de UPDATE verklaring (en ik neem aan DISTINCT is niet nodig, als ID een primaire sleutel - hoewel het moeilijk te zeggen is wat de tabel is met een naam als 121s ). Of ze allemaal daadwerkelijk waren veranderd waarden is iets anders dat u kunt overwegen te valideren voordat u de gewijzigde datum/tijd toepast. Afgezien daarvan zou ik het waarschijnlijk op deze manier doen:

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

Als je 100% onfeilbare garantie wilt hebben dat ze allemaal worden bijgewerkt met dezelfde tijdstempel (hoewel ik niet weet of ik ooit meerdere waarden in dit gebruik heb gezien):

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

En als u er zeker van wilt zijn dat de update alleen plaatsvindt als bijvoorbeeld de kolom foo waarde gewijzigd, zou je kunnen zeggen:

  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;

Dat is het algemene patroon, maar het wordt ingewikkelder als foo is nullable, omdat SQL Server niet kan overeenkomen met rijen waar de ene kant een waarde heeft en de andere niet (of beide niet). In dat geval zou je dit doen:

   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)
   );

Sommige mensen zullen zo zeggen "Ik kan COALESCE of ISNULL gewoon gebruiken tegen een magische waarde":

WHERE COALESCE(t.foo, 'magic') <> COALESCE(i.foo, 'magic')

...en ik zal je hiervoor waarschuwen, omdat je constant op zoek bent naar een magische waarde die niet in de gegevens kan bestaan.



  1. MIJN SQL - Foutcode:1010. Fout bij verwijderen van database (kan niet rmdir; errno:13)

  2. twee keer dezelfde tabel op verschillende kolommen plaatsen

  3. Hoe de positie van de regexp-overeenkomst in de tekenreeks in PostgreSQL te krijgen?

  4. Mysql - Hoe bestel ik resultaten door afwisselende (1,2,3, 1, 2, 3, 1, 2, 3,) rijen, is dat mogelijk?