- 1 -
Khái quát v Trigger – Ph n 1
Trigger th xem m t d ng đ c bi t c a th t c n i
t i, b i 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 đó ng i l p ườ
trình s ch ra.
1/- Trigger?
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 đ c thi t k thi hành t i server (trong hình client/server). ượ ế ế
Các x ta mu n chúng s đ c t đ ng th c hi n khi 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 ngng bu c toàn v n d li u v i các Trigger
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 đó thaoơ ơ
tác thêm (insert), thao tác s a (update) 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 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 v i m c tiêu 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 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 , 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 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 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 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 phi u xu t 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 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 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 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 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 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 s thay đ i d li u trên 1 table 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 ho c vi c x 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 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 ế
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 b n mu n chúng t đ ng th c hi n t i phía server khi 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, table đ c t o v i tên table 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 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 th xây d ng bên trong 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 th th c hi n nhi u hành đ ng (multiple actions), 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, table đ c t o v i ượ ượ
tên table 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 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 b n c n quan tâm các trigger lo i INSTEAD OF ế
DELETE INSTEAD OF UPDATE không th đ c đ nh nghĩa trên các table ch a ượ
khóa ngo i trên dây quan h n i t table ch a thông qua khóa ngo i đ n table ế
khá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.