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

Buat Kolom "Terakhir Dimodifikasi" di SQL Server

Beberapa tabel database menyertakan kolom "terakhir diubah", yang menyimpan tanggal dan waktu baris terakhir diperbarui. Setiap kali baris diperbarui, tanggal diperbarui untuk mencerminkan tanggal dan waktu pembaruan tersebut.

Di SQL Server, Anda dapat menggunakan pemicu untuk melakukan pembaruan ini.

Pemicu adalah jenis khusus dari prosedur tersimpan yang secara otomatis berjalan ketika suatu peristiwa terjadi di server database.

Anda dapat menggunakan CREATE TRIGGER pernyataan untuk membuat pemicu saat menggunakan T-SQL. Pernyataan ini dapat digunakan untuk membuat DML, DDL, atau pemicu masuk.

Contoh

Kode berikut membuat tabel, serta pemicu yang memperbarui ModifiedDate kolom setiap kali ada pembaruan.

CREATE TABLE dbo.Books (
BookId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
BookName nvarchar(1000) NOT NULL,
CreateDate datetime DEFAULT CURRENT_TIMESTAMP,
ModifiedDate datetime DEFAULT CURRENT_TIMESTAMP
);

CREATE TRIGGER trg_Books_UpdateModifiedDate
ON dbo.Books
AFTER UPDATE
AS
UPDATE dbo.Books
SET ModifiedDate = CURRENT_TIMESTAMP
WHERE BookId IN (SELECT DISTINCT BookId FROM inserted);

Menyisipkan Baris

Mari kita masukkan baris dan pilih untuk melihat hasil dari DEFAULT kendala:

INSERT INTO Books (BookName) 
VALUES ('Trigger Happy');

SELECT * FROM Books;

Hasil (menggunakan keluaran vertikal):

-[ RECORD 1 ]-------------------------
BookId       | 1
BookName     | Trigger Happy
CreateDate   | 2020-08-17 23:33:15.230
ModifiedDate | 2020-08-17 23:33:15.230

Ini ditampilkan menggunakan output vertikal agar lebih mudah dibaca (sehingga Anda tidak perlu menggulir ke samping untuk membaca semua kolom).

Dalam hal ini, baik CreatedDate dan ModifiedDate kolom berisi nilai yang sama. Namun, jika baris diperbarui, ModifiedDate nilai harus berubah. Itu sebabnya kami membuat pemicunya.

Perbarui Baris

Sekarang mari perbarui baris dan pilih hasilnya.

UPDATE Books 
SET BookName = 'Trigger Hippy'
WHERE BookId = 1;

SELECT * FROM Books;

Hasil (menggunakan keluaran vertikal):

-[ RECORD 1 ]-------------------------
BookId       | 1
BookName     | Trigger Hippy
CreateDate   | 2020-08-17 23:33:15.230
ModifiedDate | 2020-08-18 00:07:39.680

Seperti yang diharapkan, ModifiedDate kolom diperbarui tetapi CreateDate kolom tetap sama.

Penjelasan Lebih Lanjut dari Kode

Di bawah ini adalah penjelasan yang lebih mendetail tentang kode yang digunakan untuk membuat tabel dan pemicu yang terkait.

Tabel

Kode berikut membuat tabel:

CREATE TABLE dbo.Books (
BookId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
BookName nvarchar(1000) NOT NULL,
CreateDate datetime DEFAULT CURRENT_TIMESTAMP,
ModifiedDate datetime DEFAULT CURRENT_TIMESTAMP
);

ModifiedDate kolom memiliki DEFAULT batasan yang menetapkan nilai default ke CURRENT_TIMESTAMP (seperti halnya CreateDate kolom).

Ini berarti bahwa ketika baris pertama kali dimasukkan, CURRENT_TIMESTAMP dimasukkan ke dalam kolom tersebut.

Ini bagus untuk penyisipan awal, tetapi tidak melayani pembaruan berikutnya. Di situlah pemicunya.

Pemicunya

Kode berikut membuat pemicu:

CREATE TRIGGER trg_Books_UpdateModifiedDate
ON dbo.Books
AFTER UPDATE
AS
UPDATE dbo.Books
SET ModifiedDate = CURRENT_TIMESTAMP
WHERE BookId IN (SELECT DISTINCT BookId FROM inserted);

Dalam hal ini, saya memanggil pemicu trg_Books_UpdateModifiedDate .

Saya membuatnya di dbo.Books database, dan itu berjalan setelah setiap UPDATE .

Saat dijalankan, ia memperbarui ModifiedDate kolom ke CURRENT_TIMESTAMP (tetapi hanya pada baris yang diperbarui, tentu saja).

Saya dapat menentukan baris mana yang diperbarui dengan mencentang inserted meja. inserted table adalah tabel sementara memori yang dibuat dan dipelihara oleh SQL Server.

inserted tabel menyimpan salinan baris yang terpengaruh selama INSERT dan UPDATE pernyataan. Selama transaksi penyisipan atau pembaruan, baris baru ditambahkan ke inserted meja dan meja pemicu. Baris dalam inserted tabel adalah salinan dari baris baru di tabel pemicu.

Selain inserted tabel, SQL Server juga membuat dan memelihara deleted meja. Transaksi pembaruan mirip dengan operasi penghapusan yang diikuti oleh operasi penyisipan; baris lama disalin ke deleted tabel terlebih dahulu, lalu baris baru disalin ke tabel pemicu dan ke inserted tabel.

Pemicu untuk Kolom “Tanggal Dibuat”

Menggunakan DEFAULT kendala adalah cara praktis untuk membuat nilai awal, tetapi Anda berisiko bahwa seseorang dapat langsung memperbarui nilai itu nanti.

Jika Anda melihat ini sebagai masalah, Anda dapat memodifikasi pemicu untuk menyertakan kolom “Tanggal Dibuat”, sehingga akan menyetel ulang ke nilai aslinya setiap kali ada pembaruan pada baris.

Anda bisa mendapatkan nilai asli dari deleted tabel, mengingat baris lama disalin ke tabel ini terlebih dahulu, sebelum pembaruan dilakukan.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kapan saya harus menggunakan titik koma di SQL Server?

  2. HAS_DBACCESS() – Temukan apakah Pengguna Dapat Mengakses Database di SQL Server

  3. Database yang dapat menangani>500 juta baris

  4. 4 Cara Menghitung Baris di Tabel SQL Server dengan Pro dan Kontra

  5. Cara Mengotomatiskan Pengumpulan Data pada Pertumbuhan Database SQL Server