Chương 8 cung cấp những kiến thức cơ bản về trigger. Sau khi học xong chương này người học có thể hiểu được khái niệm về trigger, biết cách tạo trigger cho table bằng lệnh create trigger và bằng công cụ quản lý management studio. Mời các bạn cùng tham khảo.
Trang 1CHƯƠNG VIII
TRIGGER
Giảng viên: Phạm Mạnh Cương
CHƯƠNG VIII
TRIGGER
Giảng viên: Phạm Mạnh Cương
Trang 2I- Khái niệm:
2
• 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 đa 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 ROLLBACK TRAN trong Trigger để bãi bỏ phát biểu cập nhật khi cần thiết.
Trang 3II- Tạo Trigger cho Table:
1 Bằng Lệnh Create Trigger
2 Bằng công cụ quản lý Management Studio
Trang 41- Lệnh Create Trigger:
4
CREATE TRIGGER <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.
Trang 52- 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 đa 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.
Trang 66
Trang 7Ví 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.Create Trigger 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’
RollBack Tran
Trang 8Ví 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.
8
Create Trigger 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’
RollBack Tran
Return
End
Update MatHang Set SoTon = SoTon - SL
From INSERTED Where MatHang.MaMH = INSERTED.MaMH
Trang 9b) Khi Delete mẫu tin
Trang 10Ví 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.
10
Create Trigger trg_XoaCTHD On CTHD
For Delete
As
Update MatHang Set SoTon = SoTon + SL
From DELETED Where MatHang.MaMH = DELETED.MaMH
Go
Trang 11c) Khi Update mẫu tin
Trang 12Ví 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.
12
Create Trigger 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’
RollBack Tran
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
Trang 13Ví 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.
Create Trigger 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
Trang 143- Nhận biết Cột được cập
nhật :
14
• 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
Trang 15Ví dụ: Sử dụng hàm Update
Create Trigger 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
RollBack Tran 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
If (@D > 0 ) Begin
RollBack Tran 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
Trang 164- Thực hiện hay không thực hiện
Trigger
16
ALTER TABLE <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
ALTER TABLE <têntable> DISABLE TRIGGER ALL
Ví dụ: Không thực hiện Trigger itrg_SoCTHD và
utrg_SoCTHD
của table CTHD
ALTER TABLE <têntable>
DISABLE TRIGGER itrg_SoCTHD, utrg_SoCTHD
Trang 17III- Sửa, Xóa Trigger:
1 Sửa Trigger:
ALTER TRIGGER <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:
DROP TRIGGER <tên_trigger> [,…n]
Trang 18CẢM ƠN
18