Khoa CNTT - Hệquản trị cơ sởdữli u 35/23/2008 Trigger là gì Trigger là một stored procedure ñặc biệtñược gọi tự ñộngkhi user cập nhật dữliệu trên một table ðược kết hợp với table: ðược
Trang 15/23/2008 Khoa CNTT - Hqun tr c sd li u 1
BÀI 9.
TRIGGER
Hi ể u ñượ c trigger là gì, công d ụ ng c ủ a nó
T ạ o trigger.
Xoá trigger
Thay ñổ i trigger
1 Gi ớ i thi ệ u Triggers
2 ðị nh ngh ĩ a Triggers
3 Triggers làm vi ệ c nh ư th ế nào
4 Các ví d ụ Triggers
5 Các l ư u ý
Trang 2Khoa CNTT - Hệquản trị cơ sởdữli u 3
5/23/2008
Trigger là gì
Trigger là một stored procedure ñặc biệtñược gọi tự ñộngkhi
user cập nhật dữliệu trên một table
ðược kết hợp với table: ðượcñịnh nghĩa trên một table cụ
thể
ðược gọi tự ñộng: Khi có một thao tác cập chật dữliệu trên
table (insert, update, hoặc delete) thì trigger của thao tác
tươngứngñược tự ñộng thực hiện
Khác với procedure, trigger không thể ñược gọi trực tiếp,
không nhận tham số
Là một phần của transaction: những lệnh trong trigger ñược
xem là một single transaction, có thể ñược roll back từbất kỳ
chổnào trong trigger
ðể th ự c hi ệ n cascade updates và cascade deletes
qua các table quan h ệ trong database
Ép bu ộ c tính toàn v ẹ n d ữ li ệ u ph ứ c t ạ p:
Thực hiện các ràng buộc có tham chiếuñến các column
trong nhiều table
ðị nh ngh ĩ a Custom Error Messages:
Dùng trigger ñể trảvềcác chuỗi thông báo trạng thái của
một hàngñộng nàoñó
B ả o trì các d ữ li ệ u không ñượ c chu ẩ n hoá
Trang 3Khoa CNTT - Hệquản trị cơ sởdữli u 5
5/23/2008
Triggers ñượ c th ự c hi ệ n t ự ñộ ng sau khi l ệ nh
INSERT , UPDATE , ho ặ c DELETE ñượ c th ự c hi ệ n
trên m ộ t table mà trigger ñ ó ñượ c ñị nh ngh ĩ a Còn
các constraints và INSTEAD OF trigger s ẽ ñượ c
ki ể m tra tr ướ c khi l ệ nh INSERT, UPDATE, ho ặ c
DELETE th ự c hi ệ n.
Constraints s ẽ ñượ c ki ể m tra tr ướ c trigger.
M ộ t table có th ể có nhi ề u Triggers cho m ộ t action
M ộ t trigger có th ể ñượ c ñị nh ngh ĩ a cho nhi ề u action
Khi có nhi ề u trigger trong m ộ t table, thì table owner
có th ể dùng procedure h ệ th ố ng sp_settriggerorder
ñể ch ỉ ñị nh trigger ñầ u và trigger cu ố i ñể th ự c thi
Th ứ t ự c ủ a các trigger còn l ạ i không th ể s ắ p x ế p
ñượ c
User ph ả i có quy ề n ñể th ự c hi ệ n t ấ t c ả các l ệ nh mà
ñượ c ñị nh ngh ĩ a trong Triggers
Table Owners không th ể t ạ o ra các Triggers trên
Views ho ặ c Temporary Tables nh ư ng có th ể tham
chi ế u ñế n view và temporary.
Trang 4Khoa CNTT - Hệquản trị cơ sởdữli u 7
5/23/2008
Triggers ho ạ t ñộ ng nh ư th ế nào ? (3)
Triggers không tr ả k ế t qu ả v ề
Triggers có th ể ñ i ề u khi ể n multi-row actions:
một hànhñộngINSERT, UPDATE, hoặcDELETEgọi một
trigger có thể ảnh hưởng lên nhiều dòng dữliệu
Ta có th ể ch ọ n:
Xửlý tất cảcác dòng cùng với nhau trong trường hợp
các dòng ảnh hưởng phải thoả ñiều kiện của trigger
Xửlý từng dòng thỏañiều kiện
Logic tables
Khi có action Insert, table logic inserted sinh
ra, có c ấ u trúc gi ố ng v ớ i c ấ u trúc table ñượ c
insert, có d ữ li ệ u là record ñ ang ñượ c insert
Khi có action delete, table deleted sinh ra, có
c ấ u trúc gi ố ng v ớ i c ấ u trúc table b ị deleted, có
d ữ li ệ u là record ñ ang b ị xoá
Khi có action update, có 2 table inserted và
deleted
Trang 5Khoa CNTT - Hệquản trị cơ sởdữli u 9
5/23/2008
CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{
{{ FOR | AFTER | INSTEAD OF }
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }
[ WITH APPEND ]
AS
[ { IF UPDATE ( column )
[ { AND | OR } UPDATE ( column ) ] [ n ]
} ]
sql_statement [ n ]
}
}
Table | view :
tên view/table mà tigger ñượ c th ự c hi ệ n khi có action t ươ ng ứ ng
WITH ENCRYPTION:
mã hoá n ộ t dung text c ủ a l ệnh create trigger trong table syscomments
AFTER:
Trigger s ẽ ñượ c g ọ i ch ỉ khi t ấ t c ả các hành ñộ ng ñ ã th ự c hi ệ n xong Các ki ể
tra constrain và cascade s ẽ ñượ c ki ể m tra hoàn thành tr ướ c khi trigger th ự c
hi ệ n
Default là AFTER n ế u ch ỉ có t ừ khoá FOR ñượ c ch ỉ ñị nh AFTER trigger
không th ể ñị nh ngh ĩ a trên view.
INSTEAD OF:
ch ỉ ñị nh trigger ñự oc th ự c hi ệ n thay cho action c ủ a trigger INSTEAD OF
triggers không cho phép c ậ p nh ậ t d ữ li ệ u trên view có WITH CHECK
OPTION.
Trang 6Khoa CNTT - Hệquản trị cơ sởdữli u 11
5/23/2008
{ [DELETE] [,] [INSERT] [,] [UPDATE] } :
Ch ỉ ñị nh action g ắ n v ớ i trigger
ðố i v ớ i INSTEAD OF triggers, action DELETEkhông cho phép trên
table mà có relationship mà ch ỉ ñị nhCASCADE ON DELETE.
T ươ ng t ự , action UPDATEkhông cho phép trên table có relationships
màCASCADE ON UPDATE.
Tabledeletedvàinsertedlà logical tables Chúng có cấu
trúc giống với table mà trigger ñượcñịnh nghĩa, chứa các
dòng giá trịcũhoặc mới mà có thểthayñổi bởi action của
user Ta có truy xuất dữliệu trong 2 table này trongñịnh
nghĩa trigger
Các giá trịkiểutext, ntext, hoặcimagetrong table inserted
vàdeletedkhông truy xuấtñược
Khi trigger ởmức 65, giá trịnull sẽ ñược trảvềcột có kiểu
text, ntext, hoặcimagetrong table insertedhoặcdeleted
nếu cột cho phép null; chuỗi zero-length ñược trảvềnếu cột
có thểnull
IF UPDATE (column): ki m tra action update trên c t
ñưc ch ñnh, không dùng cho action delete
With Append: Chèn thêm trigger này vào các trigger ñã có
trướcñó
Trang 7Khoa CNTT - Hệquản trị cơ sởdữli u 13
5/23/2008
Use Northwind
GO
CREATE TRIGGER Empl_Delete ON Employees
AS
IF (SELECT COUNT(*) FROM Deleted ) > 1
BEGIN
RAISERROR(
'You cannot delete more than one employee at a time.',
16, 1)
ROLLBACK TRANSACTION
END
Trang 8Khoa CNTT - Hệquản trị cơ sởdữli u 15
5/23/2008
USE pubs
IF EXISTS (SELECT name FROM sysobjects WHERE name =
'reminder' AND type = 'TR')
DROP TRIGGER reminder
GO
CREATE TRIGGER reminder ON titles
FOR INSERT, UPDATE
AS
RAISERROR (50009, 16, 10)
GO
Alter trigger
ALTER TRIGGER trigger_name ON table
[WITH ENCRYPTION]
{{FOR {[,] [DELETE] [,] [UPDATE] [,][INSERT]}
AS
sql_statement [ n] }
| {FOR {[,] [INSERT] [,] [UPDATE]}
AS
IF UPDATE (column)
[{AND | OR} UPDATE (column) [, n]]
sql_statement [ n] }
}
Trang 9Khoa CNTT - Hệquản trị cơ sởdữli u 17
5/23/2008
Xoá trigger
T ạ o trigger ñể khi insert m ộ t record vào trong table
CHITIETHOADON, thì c ậ p nh ậ t l ạ i SLTON c ủ a v ậ t
t ư ñ ó trong table VATTU
T ạ o trigger ñể không cho phép m ộ t hoá ñơ n có
nhi ề u h ơ n 4 chi ti ế t hoá ñơ n
T ạ o trigger không cho phép hai v ậ t t ư trùng tên
T ạ o trigger ñể không cho phép xoá cùng lúc nhi ề u
h ơ n m ộ t khách hàng
Trang 10Khoa CNTT - Hệquản trị cơ sởdữli u 19
5/23/2008
T ạ o trigger ñể không cho phép xoá m ộ t v ậ t t ư
mà ñ ã có ít nh ấ t m ộ t chi ti ế t hoá ñơ n c ủ a v ậ t
t ư ñ ó.
T ạ o trigger ñể ki ể m tra s ố l ượ ng bán ra c ủ a
m ộ t v ậ t t ư ph ả i nh ỏ h ơ n s ố l ượ ng t ồ n trong
kho
create trigger t1
on chitiethoadon1
for insert
as
declare @sl int, @mavt varchar(10)
select @sl = sl, @mavt = mavt from inserted
update vattu1 set slt=slt- @sl where mavt =@mavt