Hôm nay TheCodeRoot sẽ hướng dẫn cách sử dụng Trigger thông qua ví dụ đơn giản. Ở đây chúng ta sẽ tạo một table backup để lưu lại data sau các thao tác insert, update, delete ở table chính cũng như thể hiện thao tác tương ứng được thực hiện.

Hôm nay TheCodeRoot sẽ hướng dẫn cách sử dụng Trigger thông qua ví dụ đơn giản. Ở đây chúng ta sẽ tạo một table backup để lưu lại data sau các thao tác insert, update, delete ở table chính cũng như thể hiện thao tác tương ứng được thực hiện.

1. Tạo table backup:

Chúng ta tạo table EmployeeArchieved để lưu lại thông tin ở table Employee, trong đó Action sẽ thể hiện thao tác tương ứng Insert/Update/Delete.

CREATE TABLE EmployeeArchieved (
	EmployeeID	bigint,
	EmployeeName	varchar(64),
	FullName	nvarchar(64),
	HandPhone	varchar(32),
	CreateDate datetime,
	Action nvarchar(16)
)

2. Tạo Trigger:

Tiếp theo các bạn tạo trigger trên table chính cho cả 3 thao tác Insert/Update/Delete như bên dưới:

CREATE TRIGGER trgEmployee
   ON dbo.Employee
   AFTER INSERT,DELETE,UPDATE
AS 
BEGIN
	IF EXISTS (SELECT 1 FROM inserted) AND NOT EXISTS (SELECT 1 FROM deleted)
		INSERT INTO dbo.EmployeeArchieved(EmployeeID, EmployeeName, FullName, HandPhone, CreateDate, Action)
		SELECT EmployeeID, EmployeeName, FullName, HandPhone, CreateDate, 'Insert' AS Action
		FROM inserted
	ELSE 
		IF NOT EXISTS (SELECT 1 FROM inserted) AND EXISTS (SELECT 1 FROM deleted)
			INSERT INTO dbo.EmployeeArchieved(EmployeeID, EmployeeName, FullName, HandPhone, CreateDate, Action)
			SELECT EmployeeID, EmployeeName, FullName, HandPhone, CreateDate, 'Delete' AS Action
			FROM deleted
		ELSE
			INSERT INTO dbo.EmployeeArchieved(EmployeeID, EmployeeName, FullName, HandPhone, CreateDate, Action)
			SELECT EmployeeID, EmployeeName, FullName, HandPhone, CreateDate, 'Update' AS Action
			FROM inserted
END
GO

Lưu ý:

- Khi insert dữ liệu sẽ được lưu trong table inserted

- Khi delete dữ liệu sẽ được lưu trong table deleted

Khi update dữ liệu trước khi thay đổi sẽ được lưu trong table deleted, dữ liệu sau khi thay đổi sẽ được lưu trong table inserted

Sau khi tạo xong Trigger mới sẽ thể hiện như hình:

3. Insert dữ liệu ở table chính:

Tiếp theo các bạn thêm 1 nhân viên mới như bên dưới:

INSERT INTO dbo.Employee (EmployeeName, Password, FullName, HandPhone, DepartmentID, PositionType, RoleMasterID, CreateDate, Status)
SELECT 'nhi.nguyen', '123456', 'Nguyen Ai Nhi', 0979123456, 1, 2, 3, GETDATE(), 1

Các bạn để ý sẽ thấy 2 dòng affect lý do là 1 dòng được insert vào bảng chính và 1 dòng insert vào bảng phụ. Xem hình bên dưới chúng ta sẽ thấy table backup xuất hiện 1 record với Action Insert:

 

     4. Update dữ liệu table chính:

UPDATE dbo.Employee
SET FullName = N'Nguyễn Nhi'
WHERE  EmployeeName = 'nhi.nguyen'

Kiểm tra table phụ các bạn sẽ thấy xuất hiện 1 record tương ứng với thao tác update như hình dưới:

    5. Xóa dữ liệu bảng chính:

DELETE dbo.Employee WHERE EmployeeName = 'nhi.nguyen'

Kiểm tra table backup:

Các bạn lưu ý là việc insert vào table chính và table backup sẽ được thực hiện trong cùng 1 transaction, do đó các bạn nên cân nhắc trong việc sử dụng trigger để tránh ảnh hưởng performance thao tác ở table chính.

Chúc các bạn thành công!

AutoCode.VN

minhnhatict@gmail.com SQL Server