Sử Dụng Trigger Trong SQL Qua Ví Dụ Cơ Bản

63 / 100

Sử Dụng Trigger Trong SQL Qua Ví Dụ Cơ Bản

Set off là gì ?

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

Cú pháp của Set off

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

Set off dùng làm gì ?

  • Set off thường được sử dụng để kiểm tra ràng buộc (test constraints) trên nhiều quan hệ (nhiều bảng/desk) hoặc trên nhiều dòng (nhiều document) của bảng.
  • Ngoài ra việc sử dụng Set off để 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.

  • 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, Replace
  • Vậy chỉ cần tạo 3 set off tương ứng là okay
    • Người dùng đặt hàngSố 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 replace 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 replace = Insert new row To Delete previous row cõ nghĩa là khi thực hiện replace 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 Set off 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 – gialaipc.com.vntHang + gialaipc.com.vntHang

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

    1. Ban đầu thêm dữ liệu và choose nó ra
      1. Đặt hàng 5 sản phẩm với mã là 1

       

      1. Cập nhật lên 10

      1. Cập nhật về 3

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

      1. Xóa đơn đặt hàng

      Supply code bài toàn 

      1. Set off thêm

       

      1. Set off Xóa

      1. Set off Sửa

      /* cập nhật hàng trong kho sau khi đặt hàng hoặc cập nhật */ CREATE TRIGGER trg_DatHang ON tbl_DatHang AFTER INSERT AS BEGIN UPDATE tbl_KhoHang SET SoLuongTon = SoLuongTon – ( SELECT SoLuongDat FROM inserted WHERE MaHang = gialaipc.com.vn ) FROM tbl_KhoHang JOIN inserted ON gialaipc.com.vn = gialaipc.com.vn END GO /* cập nhật hàng trong kho sau khi cập nhật đặt hàng */ CREATE TRIGGER trg_CapNhatDatHang on tbl_DatHang after replace AS BEGIN UPDATE tbl_KhoHang SET SoLuongTon = SoLuongTon – (SELECT SoLuongDat FROM inserted WHERE MaHang = gialaipc.com.vnng) + (SELECT SoLuongDat FROM deleted WHERE MaHang = gialaipc.com.vnng) FROM tbl_KhoHang JOIN deleted ON gialaipc.com.vn = gialaipc.com.vn finish GO /* cập nhật hàng trong kho sau khi hủy đặt hàng */ create TRIGGER trg_HuyDatHang ON tbl_DatHang FOR DELETE AS BEGIN UPDATE tbl_KhoHang SET SoLuongTon = SoLuongTon + (SELECT SoLuongDat FROM deleted WHERE MaHang = gialaipc.com.vnng) FROM tbl_KhoHang JOIN deleted ON gialaipc.com.vn = gialaipc.com.vn END

      Kết luận

      Việc mà bạn sử dụng Set off 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 Set off 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ọ.