Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Memicu dan memperbarui ke baris di SQL Server setelah diperbarui

inserted adalah tabel semu dan pasti berisi semua baris kanan yang terpengaruh oleh UPDATE pernyataan (dan saya berasumsi DISTINCT tidak perlu, jika ID kunci utama - meskipun sulit untuk mengetahui apa tabel dengan nama seperti 121s ). Apakah semuanya benar-benar berubah values ​​adalah hal lain yang mungkin Anda pertimbangkan untuk divalidasi sebelum menerapkan tanggal/waktu yang dimodifikasi. Kecuali itu, saya mungkin akan melakukannya dengan cara ini:

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

Jika Anda ingin mendapatkan jaminan 100% sangat mudah bahwa semuanya diperbarui dengan stempel waktu yang sama (walaupun saya tidak tahu apakah saya pernah melihat banyak nilai dalam kasus penggunaan ini):

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

Dan jika Anda ingin memastikan bahwa pembaruan hanya terjadi jika, katakanlah, kolom foo diubah nilainya, bisa dibilang:

  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;

Itu pola umumnya, tetapi menjadi lebih rumit jika foo tidak dapat dibatalkan, karena SQL Server tidak akan dapat mencocokkan pada baris di mana satu sisi memiliki nilai dan sisi lainnya tidak (atau keduanya tidak). Dalam hal ini Anda akan melakukan ini:

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

Beberapa orang akan mengatakan "Saya hanya bisa menggunakan COALESCE atau ISNULL terhadap beberapa nilai ajaib" seperti ini:

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

...dan saya akan memperingatkan Anda tentang hal ini, karena Anda akan terus-menerus mencari nilai ajaib yang tidak ada dalam data.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Indeks SQL Server - naik atau turun, apa bedanya?

  2. Konversi Nomor Bulan ke Nama Bulan di SQL Server (T-SQL)

  3. Membuat versi database SQL Server

  4. Menangkap beberapa pesan kesalahan dari satu pernyataan di dalam TRY CATCH

  5. Mengubah format tanggal pada DB SQL Server dan bukan di seluruh server menjadi hh/bb/tttt