Sử dụng trigger (2)

Bài trước chúng ta đã đề cập về cú pháp và cách sử dụng Trigger, bài này ứng dụng trigger vào vấn đề tự động hóa một số tác vụ của hệ thống.

Nếu bạn chưa biết cú pháp sử dụng trigger, tham khảo bài viết này trước khi đọc tiếp bài viết này Trigger và cách sử dụng

Bài toán thực tế đặt ra như sau:

Hệ thống quản lý thư viện có các bảng trong đó có bảng Sách để quản lý số sách có trong thư viện, cấu trúc của bảng sách gồm các trường

Sach
ID (Char(10))
Tieude
Tacgia
Tomtat
Soluong

Bảng mượn trả để theo dõi thành viên mượn và trả sách, cấu trúc các trường của bảng MuonTra

MuonTra
Id
ThanhVienID
SachId
NgayMuon
NgayTra

Nghiệp vụ bài toán được cho là, khi một người mượn sách, một bản ghi được thêm vào bảng mượn trả và số sách giảm 1 cuốn. Khi trả sách, số lượng của cuốn sách đó tăng thêm 1 và khi trả sách, thủ thư chỉ cần cập nhật trường ngày trả của hàng tương ứng với việc mượn trả sách

Bây giờ chúng ta cài đặt trigger để tự động hóa việc tăng hoặc giảm số lượng khi cho mượn hoặc nhận lại sách

Trigger 1 – Giảm số lượng sách khi cho mượn

Create trigger InsTrigger on MuonTra

FOR INSERT

As

Declare @bookCode char(10)

select @bookCode = Id from inserted

update Sach set Soluong = Soluong – 1 where Id = @bookCode

Trigger 2- tăng số lượng sách khi nhận lại sách

Create trigger UpdTrigger on MuonTra

FOR Update

As

Declare @bookcode char(10)

select @bookcode = Id from inserted

update Sach set Soluong = Soluong + 1 where Id = @bookcode

Trigger và cách sử dụng

Trigger là gì?

Về bản chất, trigger là một đối tượng của SQL Server, giống như stored procedures hoặc function nhưng điểm KHÁC là trigger được tự động thực hiện mỗi khi có các thao tác dữ liệu trên bảng hoặc đối tượng mà chúng ta cài đặt Trigger.

Trigger sử dụng vào mục đích gì?

Khi nói đến ràng buộc dữ liệu (constraints), chúng ta thường được đề cập các loại ràng buộc sau:

  • Primary key – Khóa chính
  • Foreign key – khóa ngoại
  • Unique key – duy nhất (không trùng lặp giá trị)
  • Not null – không được phép để rỗng
  • Default – giá trị mặc định
  • Check – ràng buộc kiểm tra
  • Trigger – trigger

Với các ràng buộc dữ liệu phức tạp, không cài đặt được với các loại ràng buộc trên, chúng ta sử dụng loại ràng buộc này – trigger.

Bên cạnh đó, trigger còn được dùng tự động lưu nhật ký các thao tác dữ liệu xảy ra. Ví dụ, khi giao dịch ngân hàng, một phát sinh giao dịch xảy ra có thể lưu nhật ký TỰ ĐỘNG bằng trigger thực hiện một cách đơn giản.

Bảng Inserted, deleted

Khi trigger xảy ra, SQL Server sử dụng 2 bảng này để phục vụ cho công việc mà trigger đảm trách, chức năng của từng bảng như sau

Thao tác dữ liệu Inserted Deleted
INSERT Dữ liệu thêm mới được lưu vào bảng này Không sử dụng
DELETE Không sử dụng Dữ liệu sẽ xóa được lưu vào bảng này
UPDATE Dữ liệu mới sẽ thay đổi Dữ liệu cũ trước khi thay đổi

Cú pháp

CREATE TRIGGER Trigger_name
ON table_name
FOR [DELETE, INSERT, UPDATE]
AS

Sql_statements

Giải thích

Trigger có tên Trigger_name được tạo ra trên bảng table_name và trigger được gọi (chạy) khi có thao tác DELETE, INSERT, UPDATE trên bảng đó

Ví dụ 1

CREATE TRIGGER CheckDiscountUpd

ON Products

FOR UPDATE AS

IF (SELECT discount FROM inserted) > (select max(Maxdisc) from discounts)

BEGIN

PRINT ‘You cannot assign a discount greater than max allowed discount’

ROLLBACK TRANSACTION

END

Giải thích ví dụ

Giả sử ràng, bảng Products có trường discount, khi cập nhật giá trị discount thì hệ thống kiểm tra xem giá trị discount có nằm trong phạm vi cho phép hay không? Nếu vượt quá thì hủy việc thay đổi đó.

Ví dụ 2: bạn không được phép thay đổi giá trị của trường payments trong bảng sales

CREATE TRIGGER NoUpdatePayterms

ON sales

FOR UPDATE AS

IF UPDATE (payterms)

BEGIN

PRINT ‘You cannot modify the payment terms for an order’

ROLLBACK TRANSACTION

END

Bài tiếp theo sẽ giải thích loại ràng buộc phức tạp không thiết lập được bằng các loại ràng buộc khác mà phải sử dụng ràng buộc loại này – Trigger