Bài giảng Trigger

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 ROLLBACK TRANtrong Trigger để bãi bỏ phát biểu cập nhật khi cần thiết.

pdf5 trang | Chia sẻ: vietpd | Lượt xem: 2726 | Lượt tải: 0download
Bạn đang xem nội dung tài liệu Bài giảng Trigger, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
1Chươ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óa2 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 ROLLBACK TRAN trong Trigger để bãi bỏ phát biểu cập nhật khi cần thiết. Mã hóa3 II- Tạo Trigger cho Table: 1. Dùng lệnh Create Trigger 2. Dùng công cụ Management Studio Mã hóa4 1- Lệnh Create Trigger: CREATE TRIGGER ON [WITH ENCRYPTION] AFTER | FOR {DELETE, INSERT, UPDATE} AS • 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. 2Mã hóa5 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óa6 a) Khi Insert mẫu tin mới INSERTED 100 SL DGBanMaMHSoHD 10249 209 CTHD 100 30 10 23 12 56 SL 20910249 DGBanMaMHSoHD 10249 10249 10248 10248 10248 38 82 96 41 104 DELETED SL DGBanMaMHSoHD 10010249 209 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óa7 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. 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 End Mã hóa8 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. 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 3Mã hóa9 b) Khi Delete mẫu tin INSERTED SL DGBanMaMHSoHD CTHD 30 10 23 12 56 SL DGBanMaMHSoHD 10249 10249 10248 10248 10248 38 82 96 41 104 DELETED 100 SL DGBanMaMHSoHD 10249 209 10010249 209 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óa10 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. Create Trigger trg_XoaCTHD On CTHD For Delete As Update MatHang Set SoTon = SoTon + SL From DELETED Where MatHang.MaMH = DELETED.MaMH Go Mã hóa11 c) Khi Update mẫu tin INSERTED 10 SL DGBanMaMHSoHD 10249 209 CTHD 100 30 10 23 12 56 SL 20910249 DGBanMaMHSoHD 10249 10249 10248 10248 10248 38 82 96 41 104 DELETED 100 SL DGBanMaMHSoHD 10249 209 10 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. Mã hóa12 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. 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 4Mã hóa13 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. 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 Print ‘So CTHD Khong the > 10’ RollBack Tran End + [SoHD] S XT CTHD -+ Mã hóa14 3- Nhận biết Cột được cập nhật : • Hàm Update() : Trả về giá trị TRUE nếu đượ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óa15 Ví dụ: Sử dụng hàm Update 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 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 And SoTon + b.SL – c.SL < 0 Mã hóa16 4- Chỉ định thứ tự thực hiện các Trigger • Thứ tự thực hiện các trigger của cùng một thao tác cập nhật đượ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. 5Mã hóa17 5- Thực hiện hay không thực hiện Trigger ALTER TABLE ENABLE | DISABLE TRIGGER ALL | [,…n] Ví dụ: Không thực hiện tất cả Triggers của table CTHD ALTER TABLE DISABLE TRIGGER ALL Ví dụ: Không thực hiện Trigger itrg_SoCTHD và utrg_SoCTHD của table CTHD ALTER TABLE DISABLE TRIGGER itrg_SoCTHD, utrg_SoCTHD Mã hóa18 III- Sửa, Xóa Trigger: 1. Sửa Trigger: ALTER TRIGGER ON [WITH ENCRYPTION] AFTER | FOR {DELETE, INSERT, UPDATE} AS 2. Xóa Trigger: DROP TRIGGER [,…n] Mã hóa19 Bài tập 1. Tạo Insert Trigger cho table DoiTD dùng kiểm tra ràng buộc: Một trận đấu chỉ có 2 đội cùng lứa tuổi và cùng phái thi đấu. 2. Tạo Update Trigger cho table DoiTD dùng kiểm tra ràng buộc: Một trận đấu chỉ có 2 đội cùng lứa tuổi và cùng phái thi đấu. Kết quả thi đấu của hai đội hoặc là hòa hoặc có đội thắng đội thua. 3. Tạo Insert Trigger cho table VDVDoi dùng kiểm tra ràng buộc: – Vận động viên chỉ có thể tham gia những đội trong cùng một câu lạc bộ – Vận động viên phải cùng phái với đội ; có lứa tuổi không lớn hơn lứa tuổi của đội. 4. Tạo Update Trigger cho table VDVDoi dùng kiểm tra ràng buộc: – Vận động viên chỉ có thể tham gia những đội trong cùng một câu lạc bộ – Vận động viên phải cùng phái với đội ; có lứa tuổi không lớn hơn lứa tuổi của đội. 5. Tạo Delete Trigger cho table TD dùng thực hiện các yêu cầu sau: Nếu trân đấu đó đã có KQTD thì không cho phép xóa, ngược lại thì xóa trận đấu đó và cả mẫu tin có cùng MSTD trong table DoiTD.