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

Trigger là gì ?

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.

tên_triggertên_bảngcâu_lệnh_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ạo3 triggertươ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ùnghủykhô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ùngcập nhậtSố lượng đặt =>Số lượng còn tăng giảm tùy ý

Vấn đề

  • Ở 2 trường hợpinsertdeleteta thực hiện bình thường. Nhưng trong trường hợpupdateSố 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ệnhupdate = Insert new row To Delete old rowcõ 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ảnginserteddeletedta 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

SLTonKhoCu = SLTonKhoCu – inserted.SLDatHang + deleted.SLDatHang

  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

Source code bài toàn

  1. Trigger thêm

  1. Trigger Xóa

  1. Trigger 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

=

tbl_KhoHang

.

MaHang

)

FROM

tbl_KhoHang

JOIN

inserted

ON

tbl_KhoHang

.

MaHang

=

inserted

.

MaHang

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

update

AS

BEGIN

UPDATE

tbl_KhoHang

SET

SoLuongTon

=

SoLuongTon

(

SELECT

SoLuongDat

FROM

inserted

WHERE

MaHang

=

tbl_KhoHang

.

MaHang

)

+

(

SELECT

SoLuongDat

FROM

deleted

WHERE

MaHang

=

tbl_KhoHang

.

MaHang

)

FROM

tbl_KhoHang

JOIN

deleted

ON

tbl_KhoHang

.

MaHang

=

deleted

.

MaHang

end

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

=

tbl_KhoHang

.

MaHang

)

FROM

tbl_KhoHang

JOIN

deleted

ON

tbl_KhoHang

.

MaHang

=

deleted

.

MaHang

END

Kết luận

trg_DatHangtbl_DatHangtbl_KhoHangSoLuongTonSoLuongTonSoLuongDatinsertedMaHangtbl_KhoHangMaHangtbl_KhoHanginsertedtbl_KhoHangMaHanginsertedMaHangGOtrg_CapNhatDatHangtbl_DatHangtbl_KhoHangSoLuongTonSoLuongTonSoLuongDatinsertedMaHangtbl_KhoHangMaHangSoLuongDatdeletedMaHangtbl_KhoHangMaHangtbl_KhoHangdeletedtbl_KhoHangMaHangdeletedMaHangGOtrg_HuyDatHangtbl_DatHangtbl_KhoHangSoLuongTonSoLuongTonSoLuongDatdeletedMaHangtbl_KhoHangMaHangtbl_KhoHangdeletedtbl_KhoHangMaHangdeletedMaHang

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ọ.

Cảm ơn vì các bạn đã đọc.

Via Viblo