sql >> Databáze >  >> RDS >> Sqlserver

Po aktualizaci spusťte a aktualizujte na řádek v SQL Server

inserted je pseudotabulka a rozhodně obsahuje všechny správné řádky, které byly ovlivněny UPDATE prohlášení (a předpokládám, že DISTINCT není nutné, pokud ID primární klíč – i když je těžké určit, co je tabulka s názvem jako 121s ). Zda se všechny skutečně změnily hodnoty je další věc, kterou můžete zvážit před použitím upraveného data/času. Kromě toho bych to pravděpodobně udělal takto:

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

Pokud chcete mít 100% spolehlivou záruku, že jsou všechny aktualizovány se stejným časovým razítkem (i když nevím, jestli jsem někdy v tomto případě viděl více hodnot):

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

A pokud chcete zajistit, aby k aktualizaci došlo pouze v případě, řekněme, ve sloupci foo změněnou hodnotu, dalo by se říci:

  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;

To je obecný vzorec, ale stane se složitějším, pokud foo má hodnotu null, protože SQL Server nebude schopen porovnat řádky, kde jedna strana má hodnotu a druhá ne (nebo obě ne). V takovém případě byste udělali toto:

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

Někteří lidé řeknou:„Prostě mohu použít COALESCE nebo ISNULL proti nějaké magické hodnotě“ takto:

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

...a před tím vás budu varovat, protože budete neustále hledat nějakou magickou hodnotu, která v datech nemůže existovat.



  1. Dvojitý požadavek mysql/php pro ajax

  2. Jak převést posloupnost znaků do formátu data pro uložení do databáze?

  3. Jak mohu sloučit dvě tabulky MySQL?

  4. postgresql s funkcí wrap sql tak pomalý?