Tran Huu Dang
9 min

Trigger

Nội dung:

  • Tổng quan Trigger
  • Làm việc với trigger

1. Giới thiệu về Trigger

INFO

  • Trigger là một dạng đặc biệt của thủ tục lưu trữ (store procedure), được thực thi một cách tự động khi có sự thay đổi dữ liệu (do tác động của câu lệnh INSERT, UPDATE, DELETE) trên một bảng nào đó.
  • Không thể gọi thực hiện trực tiếp Trigger bằng lệnh EXECUTE
  • Trigger là một stored procedure không có tham số.
  • Trigger được lưu trữ trong DB Server và thường hay được dùng để kiểm tra ràng buộc toàn vẹn dữ liệu.
  • Thông thường dữ liệu các thao tác insert, update, delete được sao lưu vào bảng tạm inserted và deleted

pic1

Các loại trigger thường dùngpic1

So sánh trigger DDL và trigger DML

  • Các trigger DDL và DML có cách sử dụng khác nhau và được thực thi với các sự kiện cơ sở dữ liệu khác nhau. pic1

2. Tạo trigger DML

TIP

  • Các trigger DML được thực thi khi sự kiện DML xảy ra trong các bảng hoặc khung nhìn.
  • Trigger DML này bao gồm các câu lệnh INSERT, UPDATE và DELETE.
  • Các trigger DML gồm ba loại chính:Trigger INSERT, Trigger UPDATE, Trigger DELETE

Các bảng Inserted và Deleted

  • Các trigger DML sử dụng hai loại bảng đặc biệt để sửa đổi dữ liệu trong cơ sở dữ liệu
  • Các bảng tạm thời lưu trữ dữ liệu ban đầu cũng như dữ liệu đã sửa đổi. Những bảng này gồm Inserted và Deleted.
  • Bảng Inserted:chứa bản sao các bản ghi được sửa đổi với hoạt động INSERT và UPDATE trên bảng trigger. Hoạt động INSERT và UPDATE sẽ tiến hành chèn các bản ghi mới vào bảng Inserted và bảng trigger
  • Bảng Deleted:chứa bản sao của các bản ghi được sửa đổi với hoạt động DELETE và UPDATE trên bảng trigger

pic1pic1

Trigger INSERT

  • Trigger INSERT được thực thi khi một bản ghi mới được chèn vào bảng
  • Trigger INSERT đảm bảo rằng giá trị đang được nhập phù hợp với các ràng buộc được định nghĩa trên bảng đó.
  • Bảng Inserted và Deleted về khía cạnh vật lý chúng không tồn tại trong cơ sở dữ liệu
  • Trigger INSERT được tạo ra bằng cách sử dụng từ khóa INSERT trong câu lệnh CREATE TRIGGER và ALTER TRIGGER.

TIP

Cú pháp
CREATE TRIGGER trigger_name ON table_name FOR {INSERT,UPDATE,DELETE} AS {sql_statements}

  • Ví dụ
    Kiểm tra dữ liệu chèn vào bảng nhân viên có lương phai lớn hơn 5000 pic1

Trigger UPDATE

  • Trigger UPDATE sao chép bản ghi gốc vào bảng Deleted và bản ghi mới vào bảng Inserted
  • Nếu các giá trị mới là hợp lệ thì bản ghi từ bảng Inserted sẽ được sao chép vào bảng dữ liệu
  • Trigger UPDATE được tạo ra bằng cách sử dụng từ khóa UPDATE trong câu lệnh CREATE TRIGGER và ALTER TRIGGER

TIP

Cú pháp
CREATE TRIGGER trigger_name ON table_name FOR {INSERT,UPDATE,DELETE} AS {sql_statements}

  • Ví dụ
    Cập nhật lương cho nhân viên, quy định lương >5000 pic1

Trigger Delete

  • Ta có thể tạo ra trigger DELETE để hạn chế người dùng không xoá một bản ghi cụ thể trong bảng
  • Khi người dùng cố gắng xóa bản ghi:
    Bản ghi bị xóa khỏi bảng trigger và chèn vào bảng Deleted
    Kiểm tra các ràng buộc liên quan khi xóa
    Nếu có ràng buộc trên bản ghi để ngăn chặn việc xóa, trigger DELETE sẽ hiển thị thông báo lỗi
    Bản ghi đã xóa được lưu trữ trong bảng Deleted được sao chép ngược lại bảng trigger.

TIP

Cú pháp
CREATE TRIGGER trigger_name ON table_name FOR {INSERT,UPDATE,DELETE} AS {sql_statements}

  • Ví dụ
    Tạo trigger Delete không cho phép xóa nhân viên có mã 005 pic1

3. Trigger AFTER

INFO

  • Trigger AFTER thực thi khi hoàn thành các hoạt động INSERT, UPDATE và DELETE.
  • Trigger AFTER chỉ có thể được tạo ra trên các bảng.

pic1

TIP

Cú pháp
CREATE TRIGGER trigger_name ON table_name FOR | AFTER {INSERT,UPDATE,DELETE} AS {sql_statements}

  • Ví dụ
    Viết trigger đếm số lượng nhân viên bị xóa khi có câu lệnh xóa trên bảng nhân viên pic1

4. Trigger INSTEAD OF

INFO

  • Trigger INSTEAD OF được thực thi thay thế cho các hoạt động INSERT, UPDATE hoặc DELETE.
  • Các trigger INSTEAD OF có thể được tạo ra trên các bảng cũng như khung nhìn.

TIP

Cú pháp
CREATE TRIGGER trigger_name ON <table_name> | <view_name> FOR | AFTER | INSTEAD OF {INSERT,UPDATE,DELETE} AS {sql_statements}

  • Ví dụ:
    Xóa nhân viên có mã 017, các thân nhân của nhân viên này tự động bị xóa theo trên bảng thân nhân pic1