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.