Cách dùng trigger DML

Xây dựng và Tối ưu hóa Trigger trong SQL Server

Florin Angelescu

Instructor

Vì sao dùng trigger DML?

  • Kích hoạt hành động khi thao tác dữ liệu
  • Ngăn thao tác dữ liệu
  • Theo dõi thay đổi dữ liệu/đối tượng DB
  • Kiểm toán người dùng và bảo mật DB
Xây dựng và Tối ưu hóa Trigger trong SQL Server

Chọn giữa AFTER và INSTEAD OF

CREATE TRIGGER MyFirstAfterTrigger
ON Table1
-- Triggered after 
-- the firing event (UPDATE)
AFTER UPDATE
AS
{trigger_actions_section};
CREATE TRIGGER MyFirstInsteadOfTrigger
ON Table2
-- Triggered instead of 
-- the firing event (UPDATE)
INSTEAD OF UPDATE
AS
{trigger_actions_section};
Xây dựng và Tối ưu hóa Trigger trong SQL Server

Chọn giữa AFTER và INSTEAD OF

Trigger AFTER

Sự kiện ban đầu kích hoạt trigger

Sự kiện ban đầu thực thi

Hành động của trigger thực thi

Cách hoạt động của AFTER Trigger

Trigger INSTEAD OF

Sự kiện ban đầu kích hoạt trigger

Sự kiện ban đầu không còn thực thi

Hành động của trigger thực thi

Cách hoạt động của INSTEAD OF Trigger

Xây dựng và Tối ưu hóa Trigger trong SQL Server

Ví dụ dùng trigger AFTER

  • Chèn dữ liệu vào bảng sales
  • Bắt đầu quy trình làm sạch dữ liệu
  • Tạo báo cáo bảng với kết quả quy trình
  • Thông báo cho quản trị viên DB
CREATE TRIGGER SalesNewInfoTrigger
ON Sales
AFTER INSERT
AS

EXEC sp_cleansing @Table = 'Sales';
EXEC sp_generateSalesReport;
EXEC sp_sendnotification;
Xây dựng và Tối ưu hóa Trigger trong SQL Server

Ví dụ dùng trigger INSTEAD OF

| Brand | Model    | Power | Stock |
|-------|----------|-------|-------|
| Ecco  | Standard | 30W   | 30    |
| Miry  | Buma     | 45W   | 0     |
| Lume  | Ultra    | 50W   | 0     |
  • Công suất thay đổi với một số mẫu
CREATE TRIGGER BulbsStockTrigger
ON Bulbs
INSTEAD OF INSERT
AS
Xây dựng và Tối ưu hóa Trigger trong SQL Server

Ví dụ dùng trigger INSTEAD OF

| Brand | Model    | Power | Stock |
|-------|----------|-------|-------|
| Ecco  | Standard | 30W   | 30    |
| Miry  | Buma     | 50W   | 100   |
| Lume  | Ultra    | 52W   | 100   |
  • Công suất thay đổi với một số mẫu
  • Chỉ cập nhật sản phẩm hết hàng
CREATE TRIGGER BulbsStockTrigger
ON Bulbs
INSTEAD OF INSERT
AS

IF EXISTS (SELECT * FROM Bulbs AS b INNER JOIN inserted AS i ON b.Brand = i.Brand AND b.Model = i.Model WHERE b.Stock = 0) BEGIN UPDATE b SET b.Power = i.Power, b.Stock = i.Stock FROM Bulbs AS b INNER JOIN inserted AS i ON b.Brand = i.Brand AND b.Model = i.Model WHERE b.Stock = 0 END
Xây dựng và Tối ưu hóa Trigger trong SQL Server

Ví dụ dùng trigger INSTEAD OF

| Brand | Model    | Power | Stock |
|-------|----------|-------|-------|
| Ecco  | Standard | 30W   | 30    |
| Miry  | Buma     | 50W   | 100   |
| Lume  | Ultra    | 52W   | 100   |
| Ecco  | Standard | 35W   | 100   |
  • Công suất thay đổi với một số mẫu
  • Chỉ cập nhật sản phẩm hết hàng
  • Thêm dòng mới cho sản phẩm còn hàng
-- First part was truncated for spacing reasons
IF EXISTS (SELECT * FROM Bulbs AS b
INNER JOIN inserted AS i
           ON b.Brand = i.Brand
          AND b.Model = i.Model
WHERE b.Stock = 0)
BEGIN
    UPDATE b
    SET b.Power = i.Power,
        b.Stock = i.Stock
    FROM Bulbs AS b
    INNER JOIN inserted AS i
                ON b.Brand = i.Brand
                  AND b.Model = i.Model
    WHERE b.Stock = 0
END
ELSE
    INSERT INTO Bulbs
    SELECT * FROM inserted;
Xây dựng và Tối ưu hóa Trigger trong SQL Server

Câu hỏi luyện tập

Xây dựng và Tối ưu hóa Trigger trong SQL Server

Preparing Video For Download...