SQL server 2005 - Chương VIII: 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 đ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.

ppt18 trang | Chia sẻ: thuychi16 | Lượt xem: 800 | Lượt tải: 0download
Bạn đang xem nội dung tài liệu SQL server 2005 - Chương VIII: Trigger, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
CHƯƠNG VIIITRIGGERGiảng viên: Phạm Mạnh Cương*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 đ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.II- Tạo Trigger cho Table:*1. Bằng Lệnh Create Trigger2. Bằng công cụ quản lý Management Studio1- 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.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 đ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.*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 CTHDFor InsertAsIf (Select Count(a.SoHD)From CTHD a Join INSERTED b On a.SoHD = b.SoHD) >= 10BeginPrint ‘So CTHD Khong the > 10’RollBack TranEndVí 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 CTHDFor InsertAsDeclare @D intSelect @D = Count( * ) From MatHang a Join INSERTED b On a.MaMH = b.MaMHWhere SoTon - b.SL 0 )BeginPrint ‘Khong du hang de ban’RollBack TranReturnEndUpdate MatHang Set SoTon = SoTon - SLFrom INSERTED Where MatHang.MaMH = INSERTED.MaMHb) Khi Delete mẫu tin*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 CTHDFor DeleteAsUpdate MatHang Set SoTon = SoTon + SLFrom DELETED Where MatHang.MaMH = DELETED.MaMHGoc) Khi Update mẫu tin*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 UpdateAsDeclare @D intSelect @D = Count( * ) From MatHang a, DELETED b, INSERTED cWhere a.MaMH = b.MaMH And a.MaMH = c.MaMH And SoTon + b.SL - c.SL 0 )BeginPrint ‘Khong du hang de ban’RollBack TranReturnEndUpdate MatHang Set SoTon = SoTon + b.SL - c.SLFrom MatHang a, DELETED b, INSERTED cWhere a.MaMH = b.MaMH And a.MaMH = c.MaMHVí 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 CTHDFor UpdateAsIf (Select Count(a.SoHD)From CTHD a Join INSERTED b On a.SoHD = b.SoHD) > 10BeginPrint ‘So CTHD Khong the > 10’RollBack TranEnd3- 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àngVí dụ: Sử dụng hàm Update*Create Trigger utrg_CTHDOn CTHD For UpdateAsIf Update(SoHD)If (Select Count(a.SoHD)From CTHD a, INSERTED bWhere a.SoHD = b.SoHD)>=10Begin RollBack Tran ReturnEndIf 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 )BeginRollBack TranReturnEndUpdate MatHangSet SoTon = SoTon + b.SL – c.SLFrom MatHang a, DELETED b,INSERTED cWhere a.MaMH = b.MaMH Anda.MaMH = c.MaMHEnd4- 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 CTHDALTER TABLE DISABLE TRIGGER ALLVí dụ: Không thực hiện Trigger itrg_SoCTHD và utrg_SoCTHDcủa table CTHDALTER TABLE DISABLE TRIGGER itrg_SoCTHD, utrg_SoCTHDIII- 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]CẢM ƠN*