Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tạo cột “Sửa đổi lần cuối” trong SQL Server

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ả CreatedDateModifiedDate 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 INSERTUPDATE 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. DTU trong cơ sở dữ liệu Azure SQL là gì và cách tìm ra chúng ta cần bao nhiêu

  2. Cách bỏ Ràng buộc khóa ngoại trong Cơ sở dữ liệu SQL Server cho tất cả các bảng - Hướng dẫn SQL Server / TSQL Phần 72

  3. Xác định kích thước hàng cho bảng

  4. Khắc phục sự cố hết luồng công nhân

  5. Sự cố bảng tạm thời RODBC khi kết nối với MS SQL Server