Có nên dùng trigger sql

Hiểu đơn giản thì Trigger là một stored procedure không có tham số. Trigger thực thi một cách tự động khi một trong ba câu lệnh Insert, Update, Delete làm thay đổi dữ liệu trên bảng có chứa trigger. 

Cú pháp của Trigger

CREATE TRIGGER tên_trigger ON tên_bảng FOR {DELETE, INSERT, UPDATE} AS câu_lệnh_sql

Trigger dùng làm gì ?

  • Trigger thường được sử dụng để kiểm tra ràng buộc (check constraints) trên nhiều quan hệ (nhiều bảng/table) hoặc trên nhiều dòng (nhiều record) của bảng.
  • Ngoài ra việc sử dụng Trigger để chương trình có những hàm chạy ngầm nhằm phục vụ nhưng trường hợp hữu hạn và thường không sử dụng cho mục đích kinh doanh hoặc giao dịch. Đọc thêm tại đây

Bài toán đặt ra.

  • Bạn có 2 bảng kho hàng và đặt hàng liên kết với nhau bởi mã hàng.

Có nên dùng trigger sql

  • Khi người dùng đặt hàng hãy tự động cập nhật số lượng tồn trong bảng kho hàng.

Giải pháp

  • Khi người dùng đặt hàng ta chỉ có 3 loại thao tác chính với CSDL là : Insert, Delete, Update
  • Vậy chỉ cần tạo 3 trigger tương ứng là ok 
  • Người dùng đặt hàng: Số lượng còn trong kho = Số lượng còn - Số lượt đặt
  • Người dùng hủy không đặt hàng nữa: Số lượng còn trong kho = Số lượng còn + Số lượt đặt
  • Người dùng cập nhật Số lượng đặt => Số lượng còn tăng giảm tùy ý

Vấn đề

  • Ở 2 trường hợp insert và delete ta thực hiện bình thường. Nhưng trong trường hợp update Số lượng hàng tồn sẽ sảy ra trong 3 trường hợp sau.
  1. Số lượng đặt ban đầu = 5 sau đó tăng lên 10 => số lượng trong kho sẽ giảm 10 tương ứng
  2. Số lượng đặt lúc này = 10 sau đó giảm xuống 3 => số lượng trong kho sẽ tăng 7 tương ứng
  • Tận dụng việc trong sql câu lệnh update = Insert new row To Delete old row cõ nghĩa là khi thực hiện update CSDL trong sql sẽ chạy việc insert dữ liệu mới trước sau đó sẽ xóa đi bảng cũ.

Giải quyết vấn đề

  • Tận dụng việc sử dụng Trigger luôn tồn tại 2 bảng inserted và deleted ta sẽ rút ra 1 công thức cập nhật trung trong mọi trường hợp

SLTonKhoCu = SLTonKhoCu - inserted.SLDatHang + deleted.SLDatHang

Thực hiện qua ví dụ nhỏ

  1. Ban đầu thêm dữ liệu và select nó ra 

Có nên dùng trigger sql

  1. Đặt hàng 5 sản phẩm với mã là 1

Có nên dùng trigger sql

Có nên dùng trigger sql

Có nên dùng trigger sql

  1. Cập nhật một số thông tin khác mà không liên quan đến số lượng

Có nên dùng trigger sql

Có nên dùng trigger sql

Source code bài toàn 

Có nên dùng trigger sql

Có nên dùng trigger sql

Có nên dùng trigger sql


Kết luận

Việc mà bạn sử dụng Trigger là không bắt buộc và chúng ta thường tưởng rằng vì thế mà chả ai dùng nó là hoàn toàn sai . Nhưng Trigger theo như mình tìm hiểu qua thì vẫn có rất nhiều nơi sẽ sử dụng nó vào mục đích riêng của họ.

Khi học và làm SQL bạn sẽ biết tới rất nhiều hàm, cú pháp câu lệnh truy vấn. Chắc hẳn bạn đã từng nghe qua về Store procedure và Trigger.

Vậy SQL Trigger là gì và có ý nghĩa như thế nào? Đây là câu hỏi rất nhiều người mới tiếp xúc với cấu trúc dữ liệu đặt ra.

Trong bài viết ngày hôm nay, hãy cùng chúng tôi tìm hiểu sâu hơn về Trigger, khi nào nên dùng chúng và những ví dụ cụ thể dễ hình dung nhất.

SQL Trigger là gì?

Có nên dùng trigger sql

Nếu bạn đã từng biết qua Store procedure thì chắc chắn sẽ nghe tới SQL Trigger. Có thể nói, Trigger là một trường hợp đặc biệt của Store procedure vì nó không có tham số. Trong đó thường sử dụng cho 3 sự kiện là Insert, Update và Delete. Tuy nhiên nếu Store chỉ có thể chạy khi người dùng gọi thì Trigger thực thi hoàn toàn tự động.

Điều này có nghĩa khi bạn thực hiện một số sự kiện làm thay đổi dữ liệu trong SQL phù hợp với điều kiện thì nó sẽ kích hoạt. Trong các tình huống ví dụ như:

  • Bạn thiết lập một Trigger insert cho thư viện sách. Nếu có thêm một quyển sách nào đó mới được thêm vào thì số lượng sách sẽ cộng thêm 1. Trigger này sẽ chạy tự động khi người dùng ấn Insert thêm sách mới.
  • Người dùng tạo Trigger cho việc update cho thư viện khi có người tới mượn sách. Trong trường hợp số quyển còn lại = số quyển sách trong kho – số sách đã mượn. Trigger chạy tự động khi quá trình update diễn ra.
  • Hoặc có thể tạo một Trigger khi admin cố gắng xóa một quyển sách nào đó trong thư viện. Bạn yêu cầu họ kiểm tra số lượng sách trong kho còn lại khi thực hiện thao tác này.

Để các Trigger được kích hoạt thì việc xảy ra với cơ sở dữ liệu cần đáp ứng đúng thứ tự thao tác hoặc điều kiện. Nó sẽ diễn ra một cách tự động mà bạn không cần phải làm bất cứ điều gì khác.

Các kiểu Trigger trong SQL

Trong SQL, bạn sẽ gặp phải 3 loại Trigger như sau:

  • Trigger cho DML (ngôn ngữ thao tác dữ liệu): bao gồm 3 kiểu là INSERT, UPDATE và DELETE.
  • Trigger cho DDL (ngôn ngữ định nghĩa dữ liệu): sử dụng cho các lệnh CREATE, ALTER và DROP.
  • Trigger cho LOGON: sử dụng để kiểm soát các lệnh khi đăng nhập vào máy chủ.

Trong đó, SQL Trigger cho DML được sử dụng nhiều nhất và có ứng dụng cao nhất. Vậy nên trong bài viết này chúng tôi đề cập chủ yếu tới cách sử dụng với DML.

Cách sử dụng SQL Trigger

Cú pháp của Trigger trong SQL như sau:

CREATE TRIGGER ON {FOR | AFTER | INSTEAD OF} {[INSERT] [,] [UPDATE] [,] [UPDATE]} AS
Trong đó:

  • có thể là một hoặc một chuỗi lệnh. Chúng sẽ được thực hiện khi thời điểm kích hoạt được xác định (FOR, INSERT, UPDATE,…).
  • FORAFTER sẽ thực thi Trigger sau khi câu lệnh kích hoạt kết thúc.
  • INSTEAD OF: thay thế cho câu lệnh kích hoạt, giúp tham chiếu chéo toàn vẹn dữ liệu.
  • INSERT,

    CREATE TRIGGER t_MuonSach ON Muon_Sach AFTER INSERT AS BEGIN UPDATE Kho_Sach SET SoLuong = SoLuong - (SELECT SLMuon FROM inserted WHERE MaSach = Kho_Sach.MaSach) FROM Kho_Sach JOIN inserted ON Kho_Sach.MaSach = inserted.MaSach END0,

    CREATE TRIGGER t_MuonSach ON Muon_Sach AFTER INSERT AS BEGIN UPDATE Kho_Sach SET SoLuong = SoLuong - (SELECT SLMuon FROM inserted WHERE MaSach = Kho_Sach.MaSach) FROM Kho_Sach JOIN inserted ON Kho_Sach.MaSach = inserted.MaSach END0 là lệnh kích hoạt cho Trigger chạy có thể dùng một hoặc nhiều tùy chọn.

Vì Trigger được chạy tự động nên bạn có thể ứng dụng như sau:

  • Khi kích hoạt việc INSERT có thể thêm một số câu lệnh đi kèm sau khi đã chèn.
  • Thực hiện các tác vụ bổ sung sau khi chèn bằng cách UPDATE giá trị trong bảng.
  • Kiểm tra các bản ghi liên quan trước khi xóa.
  • Cập nhật các giá trị sau khi đã xóa xong.

Nhìn chung nếu bạn biết về SQL Trigger sẽ rất dễ dàng thao tác và ứng dụng nó.

Ví dụ về Trigger trong SQL

Cũng về bài toán mượn sách trong thư viện ta có 2 bảng dữ liệu như sau:

Bảng Kho_Sach:

Kho_SachIDSachMaSachTenSachSoLuong

Bảng Muon_Sach:

Muon_SachIDMuonMaSachSLMuonDistrict

Vấn đề đặt ra khi hành động mượn sách sẽ có những trường hợp sau:

  • Học sinh muốn mượn thêm một vài quyển sách nữa → sinh ra lệnh update vào bảng Muon_Sach. Vậy nên số lượng sách trong Kho sẽ thay đổi.
  • Học sinh không muốn mượn nữa, số lượng sách đã insert sẽ trả về kho, hủy phiếu mượn.
  • Học sinh mượn thành công thì số lượng sách trong Kho sẽ phải cập nhật lại.

Chúng ta sẽ giải quyết vấn đề này bằng 3 Trigger như sau:

Ví dụ Trigger INSERT

SQL Trigger sau đây sẽ cập nhật số lượng hàng tồn sau khi học sinh tiến hành mượn sách:

CREATE TRIGGER t_MuonSach ON Muon_Sach AFTER INSERT AS BEGIN UPDATE Kho_Sach SET SoLuong = SoLuong - (SELECT SLMuon FROM inserted WHERE MaSach = Kho_Sach.MaSach) FROM Kho_Sach JOIN inserted ON Kho_Sach.MaSach = inserted.MaSach END
Trong ví dụ này, chúng ta thấy bảng inserted, Trigger truy cập vào bảng inserted và cho phép bạn lấy các giá trị mong muốn. Trigger sẽ được kích hoạt sau khi sự kiện mượn sách tiến hàng. Lúc đó bạn truy vấn cơ sở dữ liệu của bảng Kho_Sach sẽ thấy số lượng sách mượn đã bị trừ đi.

Ví dụ Trigger DELETE

Trigger dưới đây sẽ sử dụng cho trường hợp người mượn hủy không muốn mượn nữa. Câu lệnh thực hiện sẽ như sau:

CREATE TRIGGER t_HuyMuonSach ON Muon_Sach FOR DELETE AS BEGIN UPDATE Kho_Sach SET SoLuong = SoLuong + (SELECT SLMuon FROM deleted WHERE MaSach = Kho_Sach.MaSach) FROM Kho_Sach JOIN deleted ON Kho_Sach.MaSach = deleted.MaSach END
Trigger sẽ được kích hoạt khi bạn hủy việc mượn sách. Số lượng sách trong kho sau khi truy vấn SELECT vẫn sẽ được bảo toàn.

Trigger dưới đây sẽ kích hoạt khi bạn đã mượn sách thành công. Kho_Sach lúc này sẽ được cập nhật lại. Cú pháp sẽ như sau:

CREATE TRIGGER t_CapNhatMuonSach ON Muon_Sach AFTER UPDATE AS BEGIN UPDATE Kho_Sach SET SoLuong = SoLuong - (SELECT SLMuon FROM inserted WHERE MaSach = Kho_Sach.MaSach) + (SELECT SLMuon FROM deleted WHERE MaSach = Kho_Sach.MaSach) FROM Kho_Sach JOIN deleted ON Kho_Sach.MaSach = deleted.MaSach END
Thông thường việc sử dụng Trigger Update sẽ truy vấn đến cả hai bảng inserted và deleted. Việc này sẽ giúp dữ liệu trong hệ thống chính xác hơn, đảm bảo không bỏ qua bất cứ hành động thêm hay xóa bỏ nào.

Khi nào thì nên sử dụng Trigger?

Nếu Trigger tiện lợi như vậy thì liệu cơ sở dữ liệu nào cũng nên dùng hay không? Do có bảng Inserted và Deleted nên ứng dụng của nó chính là chống việc xóa các dữ liệu quan trọng. Tuy nhiên so với các thủ tục lưu trữ và câu lệnh khác Trigger tất nhiên cũng có sự hạn chế. Thông thường mọi người chỉ dùng cho các hành động Update, Insert và Delete.

Ngoài ra, do khả năng chạy ngầm nên nhiều Trigger khiến hệ thống chậm lại. Và nó cũng không thể thay thế hoàn toàn các tác vụ khác trên cơ sở dữ liệu. Tuy nhiên người dùng có thể dùng Trigger như một cách để kiểm tra sự ràng buộc của dữ liệu.

Tổng kết

Trên đây là các thông tin về SQL Trigger mà chúng tôi muốn gửi tới bạn. Sử dụng trình kích hoạt này mang đến những điểm tiện lợi cho nhiều hệ thống. Tuy nhiên tùy theo mục đích mà viết Trigger phù hợp với các tác vụ gây thay đổi trên cơ sở dữ liệu.

Nếu còn gặp bất cứ vướng mắc gì về Trigger trong SQL, hãy để lại ở bên bình luận bên dưới, BKHOST sẽ trả lời bạn trong thời gian sớm nhất.

P/s: Bạn cũng có thể truy cập vào Blog của BKHOST để đọc thêm các bài viết chia sẻ kiến thức về lập trình, quản trị mạng, website, domain, hosting, vps, server, email,… Chúc bạn thành công.