
- 1 -
Khái quát v Trigger – Ph n 1ề ầ
Trigger có th xem là m t d ng đ c bi t c a th t c n iể ộ ạ ặ ệ ủ ủ ụ ộ
t i, b i vì bên trong n i dung c a trigger l u tr các câu l nhạ ở ộ ủ ư ữ ệ
dùng đ th c hi n m t s hành đ ng nào đó mà ng i l pể ự ệ ộ ố ộ ườ ậ
trình s ch ra.ẽ ỉ
1/- Trigger là gì ?
Tuy nhiên khác v i th t c n i t i, trigger hoàn toàn không có tham s . Ngoài ra chúngớ ủ ụ ộ ạ ố
ta có th g i th c hi n tr c ti p trigger b ng l nh ể ọ ự ệ ự ế ằ ệ EXECUTE nh th t c n i t iư ủ ụ ộ ạ
ho c b ng b t kỳ m t l nh nào khác, thay vào đó trigger s đ c th c hi n m t cáchặ ằ ấ ộ ệ ẽ ượ ự ệ ộ
t đ ng khi d li u c a b ng có liên quan đ n trigger b c p nh t.ự ộ ữ ệ ủ ả ế ị ậ ậ
Chính nh vào tính năng đ c bi t là t đ ng th c hi n mà n i dung các l nh bên trongờ ặ ệ ự ộ ự ệ ộ ệ
trigger đ c dùng cho các công vi c sau :ượ ệ
• Ki m tra các ràng bu c toàn v n d li u ph c t p.ể ộ ẹ ữ ệ ứ ạ
• Th c hi n các x lý đ c thi t k thi hành t i server (trong mô hình client/server).ự ệ ử ượ ế ế ạ
Các x lý mà ta mu n chúng s đ c t đ ng th c hi n khi có thao tác ử ố ẽ ượ ự ộ ự ệ INSERT,
UPDATE ho c ặDELETE x y ra.ả
• Trigger cũng đ c dùng đ thay th các constraint trong tr ng h p ta mu n vi cượ ể ế ườ ợ ố ệ
ki m tra ràng bu c d li u kèm theo các câu thông báo thích h p theo ý mu n ng iể ộ ữ ệ ợ ố ườ
dùng.
2/- M r ng ràng bu c toàn v n d li u v i các Trigger ở ộ ộ ẹ ữ ệ ớ
Có 3 thao tác c b n làm thay đ i d li u trên các b ng c a c s d li u đó là thaoơ ả ổ ữ ệ ả ủ ơ ở ữ ệ
tác thêm (insert), thao tác s a (update) và thao tác xóa (delete). Nh v y đ đ m b oử ư ậ ể ả ả
d li u nh t quán và đúng đ n, ta c n ki m tra vi c th c hi n c a 3 thao tác này.ữ ệ ấ ắ ầ ể ệ ự ệ ủ
Có 2 cách ki m tra : ki m tra m c giao di n và ki m tra m c c s d li u.ể ể ứ ệ ể ứ ơ ở ữ ệ
• Ki m tra m c giao di n :ể ứ ệ công vi c này chính là công vi c l p trình trên các màn hìnhệ ệ ậ
giao di n.ệ
• Ki m tra m c c s d li u :ể ứ ơ ở ữ ệ công vi c này đ c th c hi n b i các đ i t ngệ ượ ự ệ ở ố ượ
constraint ho c trigger.ặ
Đ i v i các ràng bu c toàn v n d li u đ n gi n nh ki m tra các ràng bu c mi n giáố ớ ộ ẹ ữ ệ ơ ả ư ể ộ ề
tr , ki m tra các ràng bu c gi a các thu c tính trên cùng m t b ng d li u, … ta nên sị ể ộ ữ ộ ộ ả ữ ệ ử
d ng đ i t ng constraint.ụ ố ượ

- 2 -
Đ i v i các ràng bu c toàn x n d li u ph c t p khác – là nh ng quy t c đ c đ nhố ớ ộ ẹ ữ ệ ứ ạ ữ ắ ượ ị
nghĩa dùng đ ki m tra tính toàn v n c a d li u trên nhi u c t ho c nhi u dòng c aể ể ẹ ủ ữ ệ ề ộ ặ ề ủ
các b ng khác nhau. Khi đó b t bu c chúng ta ph i s d ng đ i t ng trigger, đ iả ắ ộ ả ử ụ ố ượ ố
t ng này cho phép chúng ta xây d ng các câu l nh bên trong nó v i m c tiêu là cácượ ự ệ ớ ụ
câu l nh này s đ c th c hi n khi các thao tác làm thay đ i d li u x y ra trên b ngệ ẽ ượ ự ệ ổ ữ ệ ả ả
d li u mà nó g n.ữ ệ ắ
M t trigger g n v i duy nh t m t đ i t ng table ho c m t đ i t ng view.ộ ắ ớ ấ ộ ố ượ ặ ộ ố ượ
3/- Các d ng ràng bu c toàn v n d li u nên dùng Trigger ạ ộ ẹ ữ ệ
Trên SQL Server, có 2 cách th c hi n ràng bu c toàn v n d li u :ự ệ ộ ẹ ữ ệ
• Ràng bu c toàn v n d li u b ng ph ng pháp mô t (declarative data integrity).ộ ẹ ữ ệ ằ ươ ả
Th c hi n ràng bu c d li u theo ph ng pháp này chính là các công vi c xác đ nhự ệ ộ ữ ệ ươ ệ ị
ràng bu c khóa chính, khóa ngo i, ki m tra mi n giá tr , … và mô t chúng t i th iộ ạ ể ề ị ả ạ ờ
đi m t o table.ể ạ
Đ c đi m c n bi t c a ph ng pháp này là vi c ki m tra s đ c th c hi n tr c khiặ ể ầ ế ủ ươ ệ ể ẽ ượ ự ệ ướ
cho phép ghi vào table.
• Ràng bu c toàn v n d li u b ng ph ng pháp theo th t c (procedural dataộ ẹ ữ ệ ằ ươ ủ ụ
integrity).
Trong ph ng pháp này, vi c ràng bu c toàn v n d li u đ c xác đ nh b i t p h pươ ệ ộ ẹ ữ ệ ượ ị ở ậ ợ
các câu l nh T-SQL. Các câu l nh ch a bên trong đ i t ng Trigger, chúng s đ cệ ệ ứ ố ượ ẽ ượ
g i thi hành khi có thao tác thêm, xóa, ho c s a d li u x y ra trên table t ng ng.ọ ặ ử ữ ệ ả ươ ứ
Đ c đi m c n bi t c a ph ng pháp này là vi c ki m tra s đ c th c hi n sau khiặ ể ầ ế ủ ươ ệ ể ẽ ượ ự ệ
d li u đ c ghi vào table.ữ ệ ượ
4/- Khi nào thì s d ng Trigger ? ử ụ
Đ gi i đáp th a đáng v n đ này, chúng ta xem xét ví d sau :ể ả ỏ ấ ề ụ
Cho m t c s d li u có c u trúc sau :ộ ơ ở ữ ệ ấ
• KHACH_HANG(ID_KHG, Ten_NCC)
• PHIEU_XUAT(ID_PX, So_PX, Ngay_PN, #ID_KHG)
• CT_PHIEU_XUAT(#ID_PX, #ID_HH, SoLuong, DonGia, ThanhTien)
• DM_HANGHOA(ID_HH, Ten_HH, DonGiaHienHanh)

- 3 -
Đ b o đ m tính nh t quán và chính xác c a d li u, c n th c hi n yêu c u ràng bu cể ả ả ấ ủ ữ ệ ầ ự ệ ầ ộ
toàn v n d li u :ẹ ữ ệ
1/- KHACH_HANG : M t khách hàng có 1 m duy nh t dùng đ phân bi t khách hàngộ ả ấ ể ệ
này v i khách hàng khác, có 1 tên khách hàng duy nh t.ớ ấ
2/- DM_HANGHOA : M t hàng hóa có 1 mã hàng hóa duy nh t dùng đ phân bi t v iộ ấ ể ệ ớ
hàng hóa khác, có 1 tên hàng hóa và 1 đ n giá bán hi n t i duy nh t.ơ ệ ạ ấ
3/- PHIEU_XUAT : M t phi u xu t có 1 mã duy nh t dùng đ phân bi t v i phi uộ ế ấ ấ ể ệ ớ ế
xu t khác, có 1 s phi u xu t, 1 ngày xu t xác đ nh.ấ ố ế ấ ấ ị
M t phi u xu t liên quan đ n duy nh t 1 khách hàng.ộ ế ấ ế ấ
M t phi u xu t có ít nh t 1 chi ti t xu t.ộ ế ấ ấ ế ấ
4/- CT_PHIEU_XUAT : M t chi ti t xu t có mã phi u xu t và mã hàng hóa dùng độ ế ấ ế ấ ể
xác đ nh khóa c a quan h . Khóa này dùng đ phân bi t v i chi ti t xu t khác, có 1 giáị ủ ệ ể ệ ớ ế ấ
tr s l ng xác đ nh, 1 đ n giá t ng ng v i đ n giá hi n hành c a hàng hóa l y tị ố ượ ị ơ ươ ứ ớ ơ ệ ủ ấ ừ
thu c tính DonGiaHienHanh c a table DM_HANG_HOA. Giá tr c a ThanhTien đ cộ ủ ị ủ ượ
tính toán d a trên công th c ThanhTien = SoLuong * DonGia.ự ứ
Câu h i đ t ra :ỏ ặ v i các yêu c u ràng bu c toàn v n d li u trên, yêu c u nào c nớ ầ ộ ẹ ữ ệ ở ầ ầ
ph i s d ng trigger đ cài đ t ?ả ử ụ ể ặ
Câu tr l i :ả ờ Ch có ràng bu c 1 đ n giá t ng ng v i đ n giá hi n hành c a hàngỉ ộ ơ ươ ứ ớ ơ ệ ủ
hóa l y t thu c tính DonGiaHienHanh c a table DM_HANG_HOA là th t s c nấ ừ ộ ủ ậ ự ầ
ph i s d ng trigger đ gi i quy t v n đ . Các ràng bu c còn l i ta có th s d ngả ử ụ ể ả ế ấ ề ộ ạ ể ử ụ
theo ph ng pháp mô t .ươ ả
Các tr ng h p s d ng Trigger :ườ ợ ử ụ
• Quan đi m c b n c n nghĩ đ n tr c tiên là ch nh ng ràng bu c d li u nào khôngể ơ ả ầ ế ướ ỉ ữ ộ ữ ệ
th dùng ph ng pháp mô t (declarative data integrity) thì m i dùng trigger đ gi iể ươ ả ớ ể ả
quy t. Tuy nhiên, b n không nh t thi t ph i tuân th theo quan đi m này trên th c tế ạ ấ ế ả ủ ể ự ế
b n hoàn toàn có th dùng trigger đ thay th cho constraint trong tr ng h p b nạ ể ể ế ườ ợ ạ
mu n t mình ki m soát và cho ra các câu thông báo thích h p ng i dùng.ố ự ể ợ ườ
• Khi có s thay đ i d li u trên 1 table và chúng ta mu n d li u trên 1 hay nhi uự ổ ữ ệ ố ữ ệ ề
table khác cũng t đ ng thay đ i theo cho phù h p.ự ộ ổ ợ
Ví d :ụ
Chúng ta có các table có c u trúc sau :ấ

- 4 -
Yêu c u :ầ
Khi thêm m i m u tin trên table DON_GIA_HANG_HOA c n update l i m cớ ẫ ầ ạ ụ
DonGiaHienHanh trên table DM_HANG_HOA sao cho
DM_HANG_HOA.DonGiaHienHanh = DON_GIA_HANG_HOA.Gia_DGHH
Gi i quy t v n đ :ả ế ấ ề
V i các yêu c u ràng bu c d li u này, ta c n ph i dùng trigger đ th c hi n. ớ ầ ộ ữ ệ ầ ả ể ự ệ
• Trên th c t đô khi ng i l p trình mu n thay đ i c u trúc l u tr c a d li u v iự ế ườ ậ ố ổ ấ ư ữ ủ ữ ệ ớ
m c tiêu tăng t c đ x lý ho c vi c x lý tính toán d dàng h n, đi u này th ngụ ố ộ ử ặ ệ ử ễ ơ ề ườ
d n đ n vi c phá v tính chu n c a c s d li u và làm tăng thêm ràng bu c toànẫ ế ệ ỡ ẩ ủ ơ ở ữ ệ ộ
v n d li u. Ví d , ta có tr ng h p sau :ẹ ữ ệ ụ ườ ợ

- 5 -
C t TongSoTien đ c b sung vào table PHIEU_XUAT v i ý nghĩa dùng đ ch a giáộ ượ ổ ớ ể ứ
tr t ng s ti n c a phi u xu t. Giá tr này b ng t ng các giá tr ch a trên c tị ổ ố ề ủ ế ấ ị ằ ổ ị ứ ộ
ThanhTien c a cùng phi u xu t trên table CT_PHIEU_XUAT. V n đ khó khăn đâyủ ế ấ ấ ề ở
là khi thêm, xóa m u tin ho c s a đ i giá tr c a c t ThanhTien trênẫ ặ ử ổ ị ủ ộ
CT_PHIEU_XUAT, tính đúng đ n c a c t TongSoTien trên PHIEU_XUAT ph i luônắ ủ ộ ả
đ c đ m b o.ượ ả ả
G p các tình hu ng nh th này, b n không c n ph i đ n đo khi quy t đ nh s d ngặ ố ư ế ạ ầ ả ắ ế ị ử ụ
triger.
• N u b n mu n c s d li u có nh ng thông báo l i thích h p theo ý mu n khi thaoế ạ ố ơ ở ữ ệ ữ ỗ ợ ố
tác thay đ i d li u vi ph m ràng bu c toàn v n, b n nên dùng trigger.ổ ữ ệ ạ ộ ẹ ạ
• T t c các x lý mà b n mu n chúng t đ ng th c hi n t i phía server khi có thaoấ ả ử ạ ố ự ộ ự ệ ạ
tác d li u INSERT, UPDATE ho c DELETE x y ra.ữ ệ ặ ả
Khái quát v Trigger – Ph n 2ề ầ
Trigger không th đ c t o trên 1 table t m (temporaryể ượ ạ ạ
table, là table đ c t o v i tên table có ký t # ho c ## phíaượ ạ ớ ự ặ
tr c) ho c table h th ng (system table). Tuy nhiên c n chú ýướ ặ ệ ố ầ
r ng các câu l nh bên trong trigger hoàn toàn có th thamằ ệ ể
chi u đ n n i dung bên trong các table t m và table h th ng.ế ế ộ ạ ệ ố
5/- Các đ c tr ng và h n ch ặ ư ạ ế
• T m t trigger có th xây d ng bên trong nó các câu l nh tác đ ng lên c t c a tableừ ộ ể ự ệ ộ ộ ủ
b t kỳ trong c s d li u ho c t ti các đ i t ng bên ngoài c s d li u hi n hành.ấ ơ ở ữ ệ ặ ớ ố ượ ơ ở ữ ệ ệ
• Có th áp d ng trigger cho đ i t ng View.ể ụ ố ượ
• M t trigger có th th c hi n nhi u hành đ ng (multiple actions), và nó có th đ cộ ể ự ệ ề ộ ể ượ
kích ho t b i nhi u h n 1 bi n c (các bi n c g m : insert, delete, update).ạ ở ề ơ ế ố ế ố ồ
• Trigger không th đ c t o trên 1 table t m (temporary table, là table đ c t o v iể ượ ạ ạ ượ ạ ớ
tên table có ký t # ho c ## phía tr c) ho c table h th ng (system table). Tuy nhiênự ặ ướ ặ ệ ố
c n chú ý r ng các câu l nh bên trong trigger hoàn toàn có th tham chi u đ n n iầ ằ ệ ể ế ế ộ
dung bên trong các table t m và table h th ng.ạ ệ ố
• M t h n ch quan tr ng mà b n c n quan tâm là các trigger lo i INSTEAD OFộ ạ ế ọ ạ ầ ạ
DELETE và INSTEAD OF UPDATE không th đ c đ nh nghĩa trên các table có ch aể ượ ị ứ
khóa ngo i và trên dây quan h n i t table ch a nó thông qua khóa ngo i đ n tableạ ệ ố ừ ứ ạ ế
khác đã có thi t đ t t ng ng trên các dây quan h tính ch t Cascade Delete Relatedế ặ ươ ứ ệ ấ
Records và Cascade Update Related Fieds.

