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.