Một số bảng cơ sở dữ liệu bao gồm cột "sửa đổi lần cuối", cột này lưu trữ ngày và giờ mà hàng được cập nhật lần cuối. Mỗi khi hàng được cập nhật, ngày được cập nhật để phản ánh ngày và giờ của bản cập nhật đó.
Trong SQL Server, bạn có thể sử dụng trình kích hoạt để thực hiện cập nhật này.
Trình kích hoạt là một loại thủ tục được lưu trữ đặc biệt tự động chạy khi một sự kiện xảy ra trong máy chủ cơ sở dữ liệu.
Bạn có thể sử dụng CREATE TRIGGER
câu lệnh để tạo một trình kích hoạt khi sử dụng T-SQL. Câu lệnh này có thể được sử dụng để tạo trình kích hoạt DML, DDL hoặc đăng nhập.
Ví dụ
Đoạn mã sau tạo một bảng, cũng như một trình kích hoạt cập nhật ModifiedDate
bất cứ khi nào có bản cập nhật.
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);
Chèn hàng
Hãy chèn một hàng và chọn hàng đó để xem kết quả của DEFAULT
ràng buộc:
INSERT INTO Books (BookName)
VALUES ('Trigger Happy');
SELECT * FROM Books;
Kết quả (sử dụng đầu ra dọc):
-[ RECORD 1 ]------------------------- BookId | 1 BookName | Trigger Happy CreateDate | 2020-08-17 23:33:15.230 ModifiedDate | 2020-08-17 23:33:15.230
Điều này được hiển thị bằng cách sử dụng đầu ra theo chiều dọc để giúp dễ đọc hơn (để bạn không phải cuộn sang bên để đọc tất cả các cột).
Trong trường hợp này, cả CreatedDate
và ModifiedDate
các cột chứa cùng một giá trị. Tuy nhiên, nếu hàng được cập nhật, thì ModifiedDate
Giá trị của ‘s sẽ thay đổi. Đó là lý do tại sao chúng tôi tạo trình kích hoạt.
Cập nhật hàng
Bây giờ, hãy cập nhật hàng và chọn kết quả.
UPDATE Books
SET BookName = 'Trigger Hippy'
WHERE BookId = 1;
SELECT * FROM Books;
Kết quả (sử dụng đầu ra dọc):
-[ RECORD 1 ]------------------------- BookId | 1 BookName | Trigger Hippy CreateDate | 2020-08-17 23:33:15.230 ModifiedDate | 2020-08-18 00:07:39.680
Như mong đợi, ModifiedDate
được cập nhật nhưng CreateDate
cột vẫn giữ nguyên.
Giải thích thêm về Quy tắc
Dưới đây là giải thích chi tiết hơn về mã được sử dụng để tạo bảng và trình kích hoạt liên quan của nó.
Bảng
Đoạn mã sau tạo bảng:
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
cột có DEFAULT
ràng buộc đặt giá trị mặc định thành CURRENT_TIMESTAMP
(CreateDate
cũng vậy cột).
Điều này có nghĩa là khi hàng được chèn lần đầu tiên, CURRENT_TIMESTAMP
được chèn vào các cột đó.
Điều này là tốt cho lần chèn đầu tiên, nhưng nó không phục vụ cho bất kỳ bản cập nhật tiếp theo nào. Đó là nơi kích hoạt xuất hiện.
Trình kích hoạt
Đoạn mã sau tạo trình kích hoạt:
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);
Trong trường hợp này, tôi đã gọi trình kích hoạt trg_Books_UpdateModifiedDate
.
Tôi đã tạo nó trên dbo.Books
cơ sở dữ liệu và nó chạy sau mỗi UPDATE
.
Khi nó chạy, nó sẽ cập nhật ModifiedDate
vào cột CURRENT_TIMESTAMP
(tất nhiên là chỉ trên hàng đã được cập nhật).
Tôi có thể xác định hàng nào đã được cập nhật bằng cách kiểm tra inserted
bàn. inserted
bảng là một bảng tạm thời, thường trú trong bộ nhớ mà SQL Server tạo và duy trì.
inserted
bảng lưu trữ bản sao của các hàng bị ảnh hưởng trong khi INSERT
và UPDATE
các câu lệnh. Trong một giao dịch chèn hoặc cập nhật, các hàng mới được thêm vào cả inserted
bảng và bảng kích hoạt. Các hàng trong inserted
bảng là bản sao của các hàng mới trong bảng trình kích hoạt.
Ngoài inserted
bảng, SQL Server cũng tạo và duy trì một deleted
bàn. Giao dịch cập nhật tương tự như thao tác xóa, sau đó là thao tác chèn; các hàng cũ được sao chép vào deleted
bảng đầu tiên, sau đó các hàng mới được sao chép vào bảng trình kích hoạt và inserted
bảng.
Kích hoạt cho cột "Ngày tạo"
Sử dụng DEFAULT
ràng buộc là một cách tiện dụng để tạo giá trị ban đầu, nhưng bạn sẽ gặp rủi ro rằng ai đó có thể trực tiếp cập nhật giá trị đó sau này.
Nếu bạn thấy đây là một vấn đề, bạn có thể sửa đổi trình kích hoạt để bao gồm cột "Ngày tạo", để nó đặt lại về giá trị ban đầu bất kỳ khi nào có cập nhật cho hàng.
Bạn có thể lấy giá trị ban đầu từ deleted
bảng, coi như các hàng cũ được sao chép vào bảng này trước khi bất kỳ cập nhật nào diễn ra.