Tải bản đầy đủ (.pdf) (18 trang)

hệ quản trị csdl sql server - chương 8 trigger

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (139.04 KB, 18 trang )

Chương 8:
TRIGGER
Giáo viên: Tạ Thúc Nhu
Khoa CNTT trường ĐH Lạc Hồng
HỆ QUẢN TRỊ CSDL
SQL SERVER
Mã hó
a
2
I-Khái niệm:
I-Khái niệm:
• Trigger làmột thủ tục không cótham số
• Một Table cóthể chứa nhiều Trigger
• Trigger tự động thực hiện khi một trong 3 phát biểu Insert,
Update, Delete thay đổi dữ liệu trên table chứa trigger.
• Trigger chỉ được thực hiện khi phát biểu cập nhật thoả mãn
các ràng buộc đã khai báo trên Table. Do đó, Trigger
thường được dùng để kiểm tra các ràng buộc màkhông thể
khai báo trên Table như các ràng buộc liên thuộc tính liên
quan hệ, liên bộ liên quan hệ, ràng buộc chu trình.
• Sử dụng lệnh ROLLBACKTRAN trong Trigger để bãi bỏ
phát biểu cập nhật khi cần thiết.
Mã hó
a
3
II-Tạo Trigger cho Table:
II-Tạo Trigger cho Table:
1. Dùng lệnh Create Trigger
2. Dùng công cụ Management Studio
Mã hó
a


4
1-Lệnh Create Trigger:
1-Lệnh Create Trigger:
CREATETRIGGER <trigger_name> ON <table name>
[WITH ENCRYPTION]
AFTER | FOR {DELETE, INSERT, UPDATE}
AS <Các phát biểu T-sql>
• Tập con của { DELETE, INSERT, UPDATE} dùng chỉ định
những phát biểu cập nhật nào trên Table sẽ kích hoạt
Trigger.
Mã hó
a
5
2-Sửdụng bảng tạm: Inserted vàDeleted
2-Sửdụng bảng tạm: Inserted vàDeleted
Khi thực hiện Trigger, SQL tự động tạo 2 bảng tạm cócùng
cấu trúc với Table được cập nhật:
• Bảng INSERTED: dùng chứa tạm các mẫu tin mới khi thực
hiện lệnh Insert hoặc mẫu tin chứa dữ liệu đã sửa đổi khi
thực hiện lệnh Update.
• Bảng DELETED : dùng chứa tạm các mẫu tin bị xóa khi thực
hiện lệnh Delete hoặc mẫu tin chứa dữ liệu cũ khi thực hiện
lệnh Update.
Ta sử dụng dữ liệu trên các table này để thực hiện xử lý bên
trong Trigger liên quan đến các mẫu tin vừa mới thêm, sửa
hay xóa.
Mã hó
a
6
a) Khi Insert mẫu tin mới

a) Khi Insert mẫu tin mới
INSERTED
100
SL DGBanMaLHSoHD
10249 20
9
CTHD
100
30
10
23
12
56
SL
209
10249
DGBanMaLHSoHD
10249
10249
10248
10248
10248
3
8
8
2
9
6
4
1

10
4
DELETED
SL DGBanMaLHSoHD
10010249 20
9
Vídụ: Kiểm tra RB: Một hóa đơn không cóquá10 chi tiết hóa đơn.
+
[SoHD]
S XT
CTHD -+
Mã hó
a
7
Vídụ: Khi thêm 1 CTHD, kiểm tra RB: Một
hóa đơn không cóquá10 chi tiết hóa đơn.
Vídụ: Khi thêm 1 CTHD, kiểm tra RB: Một
hóa đơn không cóquá10 chi tiết hóa đơn.
CreateTrigger itrg_SoCTHD On CTHD
For Insert
As
If (Select Count(a.SoHD)
From CTHD a Join INSERTED b On a.SoHD = b.SoHD) >= 10
Begin
Print ‘So CTHD Khong the > 10’
RollBackTran
End
Mã hó
a
8

Vídụ: Khi thêm chi tiết hóa đơn thìphải giảm số tồn
của mặt hàng đã ghi trên chi tiết hóa đơn.
Vídụ: Khi thêm chi tiết hóa đơn thìphải giảm số tồn
của mặt hàng đã ghi trên chi tiết hóa đơn.
CreateTrigger itrg_GiamTon On CTHD
For Insert
As
Declare @D int
Select @D = Count( * ) From MatHang a Join INSERTED b On a.MaMH = b.MaMH
Where SoTon -b.SL < 0
If (@D > 0 )
Begin
Print ‘Khong du hang de ban’
RollBackTran
Return
End
Update MatHang Set SoTon = SoTon -SL
From INSERTED Where MatHang.MaMH = INSERTED.MaMH
Mã hó
a
9
b) Khi Delete mẫu tin
b) Khi Delete mẫu tin
INSERTED
SL DGBanMaLHSoHD
CTHD
30
10
23
12

56
SL DGBanMaLHSoHD
10249
10249
10248
10248
10248
3
8
8
2
9
6
4
1
10
4
DELETED
100
SL DGBanMaLHSoHD
10249 20
9
10010249 20
9
Vídụ: Khi xóa một chi tiết hóa đơn thìphải tăng số tồn của mặt hàng đã ghi
trên chi tiết hóa đơn.
Mã hó
a
10
Vídụ: Khi xóa một chi tiết hóa đơn thìphải tăng số

tồn của mặt hàng đã ghi trên chi tiết hóa đơn.
Vídụ: Khi xóa một chi tiết hóa đơn thìphải tăng số
tồn của mặt hàng đã ghi trên chi tiết hóa đơn.
CreateTrigger trg_XoaCTHD On CTHD
For Delete
As
Update MatHang Set SoTon = SoTon + SL
From DELETED Where MatHang.MaMH = DELETED.MaMH
Go
Mã hó
a
11
c) Khi Update mẫu tin
c) Khi Update mẫu tin
INSERTED
10
SL DGBanMaLHSoHD
10249 20
9
CTHD
10
30
10
23
12
56
SL
209
10249
DGBanMaLHSoHD

10249
10249
10248
10248
10248
3
8
8
2
9
6
4
1
10
4
DELETED
100
SL DGBanMaLHSoHD
10249 20
9
10010249 20
9
Vídụ: Khi sửa SoHD của CTHD, kiểm tra RB: Một hóa đơn không cóquá
10 chi tiết hóa đơn.
+
[SoHD]
S XT
CTHD -+
Mã hó
a

12
Vídụ: Khi sửa SoHD của CTHD, kiểm tra RB: Một
hóa đơn không cóquá10 chi tiết hóa đơn.
Vídụ: Khi sửa SoHD của CTHD, kiểm tra RB: Một
hóa đơn không cóquá10 chi tiết hóa đơn.
CreateTrigger utrg_SoCTHD On CTHD
For Update
As
If (Select Count(a.SoHD)
From CTHD a Join INSERTED b On a.SoHD = b.SoHD) > 10
Begin
Print ‘So CTHD Khong the > 10’
RollBackTran
End
+
[SoHD]
S XT
CTHD -+
Mã hó
a
13
Vídụ: Khi sửa số lượng trên các chi tiết hóa đơn thìphải
sửa số tồn của mặt hàng đã ghi trên chi tiết hóa đơn.
Vídụ: Khi sửa số lượng trên các chi tiết hóa đơn thìphải
sửa số tồn của mặt hàng đã ghi trên chi tiết hóa đơn.
CreateTrigger utrg_SuaCTHD On CTHD For Update
As
Declare @D int
Select @D = Count( * ) From MatHang a, DELETED b, INSERTED c
Where a.MaMH = b.MaMH And a.MaMH = c.MaMH And SoTon + b.SL -c.SL < 0

If (@D > 0 )
Begin
Print ‘Khong du hang de ban’
RollBackTran
Return
End
Update MatHang Set SoTon = SoTon + b.SL -c.SL
From MatHang a, DELETED b, INSERTED c
Where a.MaMH = b.MaMH And a.MaMH = c.MaMH
Mã hó
a
14
3-Nhận biết Cột được cập nhật:
3-Nhận biết Cột được cập nhật:
• Hàm Update(<Column Name>): Trả về giátrị TRUE nếu
<Column Name> được cập nhật dữ liệu.
Vídụ: Khi sửa thông tin chi tiết hóa đơn:
• Nếu sửa SoHD thìkiểm tra RB "Một hóa đơn không cóquá
10 CTHD
• Nếu sửa SL thì thay đổi số tồn của mặt hàng
Mã hó
a
15
Vídụ: Sử dụng hàm Update
Vídụ: Sử dụng hàm Update
If (@D > 0 )
Begin
RollBackTran
Return
End

Update MatHang
Set SoTon = SoTon + b.SL –c.SL
From MatHang a, DELETED b,
INSERTED c
Where a.MaMH = b.MaMH And
a.MaMH = c.MaMH
End
CreateTrigger utrg_CTHD
On CTHD For Update
As
If Update(SoHD)
If (Select Count(a.SoHD)
From CTHD a, INSERTED b
Where a.SoHD = b.SoHD)>=10
Begin
RollBackTran
Return
End
If Update(SL)
Begin
Declare @D int
Select @D = Count( * )
From MatHang a, DELETED b,
INSERTED c
Where a.MaMH = b.MaMH And
a.MaMH = c.MaMH
And SoTon + b.SL –c.SL < 0
Mã hó
a
16

4-Chỉ định thứ tự thực hiện các Trigger
4-Chỉ định thứ tự thực hiện các Trigger
• Nếu cùng một thao tác trên một Table màcónhiều Trigger
(khác tên nhau). Khi đóthứ tự thực hiện các trigger được
xác định dựa trên thứ tự tạo ra chúng.
• Để thay đổi thứ tự thực hiện mặc định này, sử dụng thủ tục:
sp_settriggerorder[@triggername = ] 'Tên trigger'
, [@order = ] 'First | Last | None'
, [@stmttype = ] 'Insert | Update | Delete'
Vídụ: sp_SetTriggerOrder itrg_SoCTHD, 'First', ‘Insert’
sp_SetTriggerOrder itrg_GiamTon, 'Last', ‘Insert’
• SP này chỉ cóthể chỉ định trigger nào được thực hiện đầu
tiên vàTrigger nào được thực hiện cuối cùng. Các Trigger
còn lại sẽ thực hiện theo thứ tự tạo ra chúng.
Mã hó
a
17
5-Thực hiện hay không thực hiện Trigger
5-Thực hiện hay không thực hiện Trigger
ALTERTABLE <têntable>
ENABLE | DISABLE TRIGGER ALL | <têntrigger>[,…n]
Vídụ: Không thực hiện tất cả Triggers của table CTHD
ALTERTABLE <têntable> DISABLE TRIGGER ALL
Vídụ: Không thực hiện Trigger itrg_SoCTHD và utrg_SoCTHD
của table CTHD
ALTERTABLE <têntable>
DISABLE TRIGGER itrg_SoCTHD, utrg_SoCTHD
Mã hó
a
18

III-Sửa, Xóa Trigger:
III-Sửa, Xóa Trigger:
1. Sửa Trigger:
ALTERTRIGGER <trigger_name> ON <table name>
[WITH ENCRYPTION]
AFTER | FOR {DELETE, INSERT, UPDATE}
AS <Các phát biểu T-sql>
2. Xóa Trigger:
DROPTRIGGER <tên_trigger> [,…n]

×