Khi nhập môn cơ sở dữ liệu, bạn sẽ được gặp khái niệm Trigger. Vậy Trigger là gì? Các câu lệnh Trigger trong SQL ra sao? Tino Group sẽ đưa ra những ví dụ đơn giản để giúp bạn hiểu rõ về Trigger nhé!
Trigger là gì?
Trigger là một stored procedure không có tham số, khi có một event như: Thêm, cập nhật hay xóa trong cơ sở dữ liệu xảy ra Trigger sẽ thực thi tự động thay đổi dữ liệu.
Bạn có thể sử dụng Trigger trên rất nhiều phần mềm quản lý cơ sở dữ liệu. Nhưng trong bài viết này, Tino Group sẽ hướng dẫn bạn sử dụng phần mềm SQL Server của Microsoft để thực hiện bạn nhé!
SQLs sẽ cung cấp cho bạn 3 loại Trigger chính như sau:
- Trigger DML sẽ được kích hoạt khi xay ra các sự kiện: insert, update và delete với dữ liệu trên bảng.
- Trigger DDL được kích hoạt khi xảy ra các lệnh như: create, alter và drop.
- Trigger Logon sẽ tự động kích hoạt trước khi các sự kiện logon xảy ra.
Khi nào nên sử dụng Trigger SQL?
Có rất nhiều cách để sử dụng Trigger, rất nhiều lập trình viên sử dụng Trigger để:
- Kiểm tra ràng buộc trên nhiều quan hệ hoặc nhiều dòng của bảng cơ sở dữ liệu.
- Sử dụng để tạo các hàm ngầm phục vụ cho một số mục nhất định, tuy nhiên, những trường hợp sử dụng hàm ngầm là rất hiếm và không nên sử dụng trong các mục đích như: kinh doanh – giao dịch thanh toán.
- Sử dụng để không cho việc xóa những dữ liệu quan trọng xảy ra.
Ưu và nhược điểm của Trigger
Ưu điểm của Trigger
- Code của Trigger trong SQL rất dễ học, dễ hiểu và dễ viết
- Tỏ ra rất hiệu quả trong việc kiểm soát những thay đổi trong cơ sở dữ liệu
- Là một phương pháp để thực hiện nhanh chóng những công việc lên lịch định kỳ
- Khả năng bắt lỗi business logic nằm ở mức độ cơ sở dữ liệu
- Bạn có thể viết lồng các Trigger lên đến 32 cấp độ! Nếu bạn chưa rõ, bạn có thể thử tham khảo bài viết Hướng dẫn sử dụng hàm IF nhiều điều kiện trong Excel để hiểu chúng lồng nhau như thế nào.
Nhược điểm của Trigger
- Trigger chỉ hỗ trợ để kiểm tra mức độ hợp lệ của các dữ liệu, điều kiện chứ không hoàn toàn thay thế công việc kiểm tra của bạn.
- Từ phía client, bạn chỉ có thể biết được sự tồn tại của các Trigger nếu nhà cung cấp gửi tài liệu cho bạn.
- Trigger hoạt động ngầm, vì thế bạn cũng khó lòng biết điều gì đang diễn ra ở phía dưới cơ sở dữ liệu.
- Khi thực hiện các update, Trigger sẽ làm gia tăng lượng công việc trên cơ sở dữ liệu và làm hệ thống bị chậm.
- Cũng khá giống với hàm if nhiều điều kiện trong Excel, nếu bạn lồng quá nhiều điều kiện lại với nhau, việc sửa lỗi, gỡ lỗi và khắc phục các sự cố là vô cùng khó! Đặc biệt là đối với những người không phát triển cơ sở dữ liệu hay Trigger đó ngay từ đầu.
- Khi viết lệnh Trigger, bạn sẽ phải xem xét đến quyền của các user, nếu user có quyền after trên bản cơ sở dữ liệu, họ sẽ có thể vô hiệu hóa chúng.
Câu lệnh Trigger trong SQL
Mẫu ví dụ
Để bài viết sinh động và dễ hiểu hơn, một ví dụ là vô cùng cần thiết. Đây là bản production.products thuộc cơ sở dữ liệu Bike Stores tại trang Comdy.vn.
Câu lệnh create Trigger trong SQL
Câu lệnh này sẽ tự động thực thi khi có bất cứ một sự kiện nào như: insert, delete và update diễn ra với bảng.
Câu lệnh như sau:
CREATE Trigger [schema_name.]Trigger_name
ON table_name
AFTER {[INSERT],[UPDATE],[DELETE]}
[NOT FOR REPLICATION]
AS
{SQL_statements}
Phân tích ra, bạn có thể thấy cú pháp này chứa:
schema_name là tên schema của Trigger, đây là một tùy chọn, bạn có thể thêm hoặc không.
Trigger_name là tên do người dùng đặt.
table_name là bảng chúng ta sẽ áp dụng Trigger
Tạo bản ghi lại sự kiện INSERT hoặc DELETE
Đây là một việc vô cùng cần thiết, khi bất cứ ai xâm phạm bất hợp pháp, bạn vẫn sẽ có một bảng lưu trữ để khôi phục lại nếu cần thiết.
Câu lệnh như sau:
CREATE Trigger production.trg_product_audit // sử dụng để tạo một Trigger mới
ON production.products // chỉ định bảng ghi Trigger kích hoạt khi có sửa đổi
AFTER INSERT, DELETE // thêm các sự kiện khiến Trigger kích hoạt
AS // đây là phần bắt đầu của Trigger
BEGIN
SET NOCOUNT ON; // thiết lập dùng để ngăn chặn thông báo số lượng bảng ghi bị ảnh hưởng cho đến khi Trigger được kích hoạt.
INSERT INTO production.product_audits( // đây là phần toán từ union ALL
product_id,
product_name,
brand_id,
category_id,
model_year,
list_price,
updated_at,
operation
)
SELECT
i.product_id,
product_name,
brand_id,
category_id,
model_year,
i.list_price,
GETDATE(),
‘INS’
FROM
inserted i
UNION ALL
SELECT
d.product_id,
product_name,
brand_id,
category_id,
model_year,
d.list_price,
GETDATE(),
‘DEL’
FROM
deleted d;
END
Giờ đây, bảng production.product_audits đã được thêm những thông tin thuộc bảng production.products. Khi có bất kỳ thay đổi gì xảy ra, những thay đổi sẽ được ghi nhận tại các cột: updated_at, operation và change_id.
Cuối cùng, bạn có thể tìm thấy Trigger của bạn tại đây:
Tạo lệnh kiểm tra hoạt động của Trigger
Trước tiên, bạn cần chèn câu lệnh sau vào bảng ghi production.products:
INSERT INTO production.products
(
product_name,
brand_id,
category_id,
model_year,
list_price
)
VALUES
(
‘Test product’,
1,
1,
2018,
599
);
Để xem nội dung của bảng ghi production.product_audits. Bạn sử dụng lệnh như sau:
SELECT
*
FROM
production.product_audits;
Câu lệnh xóa
Để xóa một hàng trong bảng production.products, bạn sử dụng lệnh:
DELETE FROM
production.products
WHERE
product_id = 322;
Để hiện hàng bị xóa trong bảng production.product_audits, bạn sử dụng lệnh như sau:
SELECT
*
FROM
production.product_audits;
Cách disable Trigger trong SQL server
Trong lúc chỉnh sửa dữ liệu hoặc khắc phục các sự cố trong cơ sở dữ liệu, việc tắt Trigger sẽ rất cần đấy bạn. Vì nếu không tắt đi và bạn chỉnh luôn, đôi khi bạn sẽ bị ngăn chặn lại hoặc nhật ký ghi lỗi sẽ bị “spam” bởi chính bạn.
Để tắt Trigger tạm thời, bạn sử dụng câu lệnh DISABLE Trigger như sau:
DISABLE Trigger [schema_name.][Trigger_name]
ON [object_name | DATABASE | ALL SERVER]
Phân tích ra:
Đầu tiên, bạn sẽ cần phải chỉ định bảng và schema cần tắt Trigger.
Để tắt toàn bộ Trigger, bạn có thể thực hiện lệnh với ví dụ tắt toàn bộ Trigger trong bảng sales.members như sau:
Tạo bản ghi Trigger sự kiện xóa:
CREATE Trigger sales.trg_members_delete
ON sales.members
AFTER DELETE
AS
BEGIN
PRINT ‘A new member has been deleted’;
END;
Lệnh xóa toàn bộ Trigger tại bản sales.members:
DISABLE Trigger ALL ON sales.members;
Qua bài viết, bạn đã có thể nắm sơ bộ được về nội dung của Trigger trong SQL, biết được Trigger là gì. Tino Group hi vọng bạn đã có được những kiến thức bổ ích để phục vụ cho việc học tập về cơ sở dữ liệu của mình. Một lần nữa, Tino Group xin chúc bạn có được nhiều bước vượt bật trên con đường phát triển sự nghiệp lập trình của mình.
Những câu hỏi thường gặp về Trigger
Học thêm về Trigger ở đâu?
Nếu bạn có mong muốn học thêm về Trigger, bạn có thể tham khảo bộ documentation của IBM về Trigger ngay tại đây. Điều kiện tiên quyết là bạn cần phải có nền tảng tiếng Anh cơ bản để đọc được những tài liệu nước ngoài nhé!
Phần mềm quản lý cơ sở dữ liệu nào là tốt nhất?
Để quản trị cơ sở dữ liệu, bạn sẽ có rất nhiều lựa chọn phần mềm. Trong chương trình đại học, bạn có thể sử dụng phần mềm SQL Server của Microsoft, đây là phần mềm được các thầy của tôi hướng dẫn sử dụng nhiều nhất. Hoặc bạn có thể tham khảo những phần mềm khác như: MySQL, Sybase, Informix, Postgres, MS Access, Oracle,…
Học SQL miễn phí ở đâu?
Để học cách sử dụng ngôn ngữ SQL một cách tốt nhất và hoàn toàn miễn phí, bạn có thể truy cập ngay vào trang W3Schools để học nhé! W3Schools cung cấp bộ chương trình bài bản, có các ví dụ thực tế và giúp bạn thực hành lập trình ngay trên trình duyệt.
Tải SQL Server miễn phí ở đâu?
Rất may mắn, Microsoft có tung ra bản SQL Server 2019 Developer full chức năng và hoàn toàn miễn phí để phát triển và thử nghiệm SQL cho các lập trình viên cá nhân, sinh viên sử dụng.
Bạn có thể tải phiên bản SQL Server 2019 Developer hoàn toàn miễn phí tại đây.