Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 18 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
18
Dung lượng
139,04 KB
Nội dung
HỆ QUẢN TRỊ CSDL SQL SERVER Chương 8: TRIGGER Giáo viên: Tạ Thúc Nhu Khoa CNTT trường ĐH Lạc Hồng I- Khái niệm: • Trigger thủ tục khơng có tham số • Một Table chứa nhiều Trigger • Trigger tự động thực phát biểu Insert, Update, Delete thay đổi liệu table chứa trigger • Trigger thực phát biểu cập nhật thoả mãn ràng buộc khai báo Table Do đó, Trigger thường dùng để kiểm tra ràng buộc mà khai báo Table ràng buộc liên thuộc tính liên quan hệ, liên liên quan hệ, ràng buộc chu trình • Sử dụng lệnh ROLLBACK TRAN Trigger để bãi bỏ phát biểu cập nhật cần thiết Mã hóa II- Tạo Trigger cho Table: Dùng lệnh Create Trigger Dùng công cụ Management Studio Mã hóa 1- Lệnh Create Trigger: CREATE TRIGGER ON [WITH ENCRYPTION] AFTER | FOR {DELETE, INSERT, UPDATE} AS • Tập { DELETE, INSERT, UPDATE} dùng định phát biểu cập nhật Table kích hoạt Trigger Mã hóa 2- Sử dụng bảng tạm: Inserted Deleted Khi thực Trigger, SQL tự động tạo bảng tạm có cấu trúc với Table cập nhật: • Bảng INSERTED: dùng chứa tạm mẫu tin thực lệnh Insert mẫu tin chứa liệu sửa đổi thực lệnh Update • Bảng DELETED : dùng chứa tạm mẫu tin bị xóa thực lệnh Delete mẫu tin chứa liệu cũ thực lệnh Update Ta sử dụng liệu table để thực xử lý bên Trigger liên quan đến mẫu tin vừa thêm, sửa hay xóa Mã hóa a) Khi Insert mẫu tin CTHD INSERTED SoHD MaLH SL 10248 56 10248 12 DGBan 10248 23 10249 10 10249 30 10249 100 20 SoHD MaLH SL 10249 10 DGBan 20 100 DELETED SoHD MaLH SL 10249 100 DGBan 20 Ví dụ : Kiểm tra RB: Một hóa đơn khơng có q 10 chi tiết hóa đơn T CTHD S X + + [SoHD] - Mã hóa Ví dụ: Khi thêm CTHD, kiểm tra RB: Một hóa đơn khơng có q 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óa Ví dụ: Khi thêm chi tiết hóa đơn phải giảm số tồn mặt hàng ghi 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 < If (@D > ) Begin Print ‘Khong du hang de ban’ RollBack Tran Return End Update MatHang Set SoTon = SoTon - SL From INSERTED Where MatHang.MaMH = INSERTED.MaMH Mã hóa b) Khi Delete mẫu tin CTHD INSERTED SoHD MaLH SL 10248 56 10248 12 DGBan 10248 23 10249 10 10249 30 10249 100 SoHD MaLH SL DGBan 10 DELETED SoHD MaLH SL DGBan 10249 20 100 20 Ví dụ: Khi xóa chi tiết hóa đơn phải tăng số tồn mặt hàng ghi chi tiết hóa đơn Mã hóa Ví dụ: Khi xóa chi tiết hóa đơn phải tăng số tồn mặt hàng ghi 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 10 Mã hóa c) Khi Update mẫu tin CTHD INSERTED SoHD MaLH SL 10248 56 10248 12 DGBan 10248 23 10249 10 10249 30 SoHD MaLH SL DGBan 10249 10 20 10249 20 10249 100 SoHD MaLH SL 10249 10 DGBan 20 10 DELETED 100 20 Ví dụ: Khi sửa SoHD CTHD, kiểm tra RB: Một hóa đơn khơng có q 10 chi tiết hóa đơn T CTHD S X + + [SoHD] - 11 Mã hóa Ví dụ: Khi sửa SoHD CTHD, kiểm tra RB: Một hóa đơn khơng có q 10 chi tiết hóa đơn T CTHD S X + + [SoHD] - 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 12 Mã hóa Ví dụ: Khi sửa số lượng chi tiết hóa đơn phải sửa số tồn mặt hàng ghi 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 < If (@D > ) 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 13 Mã hóa 3- Nhận biết Cột cập nhật : • Hàm Update() : Trả giá trị TRUE cập nhật liệu Ví dụ: Khi sửa thơng tin chi tiết hóa đơn: • Nếu sửa SoHD kiểm tra RB "Một hóa đơn khơng có q 10 CTHD • Nếu sửa SL thay đổi số tồn mặt hàng 14 Mã hóa Ví 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 And SoTon + b.SL – c.SL < If (@D > ) 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 15 Mã hóa 4- Chỉ định thứ tự thực Trigger • Nếu thao tác Table mà có nhiều Trigger (khác tên nhau) Khi thứ tự thực trigger xác định dựa thứ tự tạo chúng • Để thay đổi thứ tự thực 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 định trigger thực Trigger thực cuối Các Trigger lại thực theo thứ tự tạo chúng 16 Mã hóa 5- Thực hay khơng thực Trigger ALTER TABLE ENABLE | DISABLE TRIGGER ALL | [,…n] Ví dụ: Không thực tất Triggers table CTHD ALTER TABLE DISABLE TRIGGER ALL Ví dụ: Khơng thực Trigger itrg_SoCTHD utrg_SoCTHD table CTHD ALTER TABLE DISABLE TRIGGER itrg_SoCTHD, utrg_SoCTHD 17 Mã hóa III- Sửa, Xóa Trigger: Sửa Trigger: ALTER TRIGGER ON [WITH ENCRYPTION] AFTER | FOR {DELETE, INSERT, UPDATE} AS Xóa Trigger: DROP TRIGGER [,…n] 18 Mã hóa ... III- Sửa, Xóa Trigger: Sửa Trigger: ALTER TRIGGER ON [WITH ENCRYPTION] AFTER | FOR {DELETE, INSERT, UPDATE} AS Xóa Trigger: DROP TRIGGER ... • SP định trigger thực Trigger thực cuối Các Trigger lại thực theo thứ tự tạo chúng 16 Mã hóa 5- Thực hay khơng thực Trigger ALTER TABLE ENABLE | DISABLE TRIGGER ALL | [,…n]... biểu cập nhật cần thiết Mã hóa II- Tạo Trigger cho Table: Dùng lệnh Create Trigger Dùng công cụ Management Studio Mã hóa 1- Lệnh Create Trigger: CREATE TRIGGER ON [WITH