Bài giảng SQL server - Chương 6 trình bày những kiến thức về trigger. Trong chương này người học sẽ tìm hiểu về: Công cụ trigger, ràng buộc dữ liệu toàn vẹn với trigger, các dạng ràng buộc toàn vẹn, bài toán, cơ chế hoạt động của trigger, các trigger phổ biến. Mời các bạn tham khảo.
10/03/2015 TRƯỜNG CAO ĐẲNG CÔNG NGHỆ THÔNG TIN THÀNH PHỐ HỒ CHÍ MINH CHƯƠNG Trigger GV: Lê Thị Minh Nguyện Email: leminhnguyen@itc.edu.vn NỘI DUNG Giới thiệu Công cụ trigger Ràng buộc liệu toàn vẹn với trigger Các dạng ràng buộc toàn vẹn Bài toán Cơ chế hoạt động trigger Các trigger phổ biến 10/03/2015 1.Giới thiệu Trigger dạng đặc biệt thủ tục nội Tuy nhiên khác với thủ tục nội tại: Khơng có tham số Không thể gọi trực tiếp lệnh EXECUTE thủ tục nội mà thực cách tự động liệu bảng có liên quan đến trigger bị cập nhật 2.Công dụng trigger Kiểm tra ràng buộc toàn vẹn liệu phức tạp Thực xử lý thiết kế thi hành server (trong mơ hình client/server) Các xử lý tự động thực có thao tác INSERT, UPDATE DELETE xảy Trigger dùng thay constraint trường hợp ta muốn việc kiểm tra ràng buộc liệu kèm theo câu thơng báo thích hợp theo ý muốn người dùng 10/03/2015 3.Ràng buộc liệu toàn vẹn với trigger Để đảm bảo liệu quán đắn, ta cần kiểm tra thực thao tác: Insert, Update Delete Có cách kiểm tra Kiểm tra mức giao diện: công việc lập trình hình giao diện Kiểm tra mức CSDL: thực đối tượng constraint trigger 3.Ràng buộc liệu toàn vẹn với trigger Đối tượng constraint kiểm tra Kiểm tra miền giá trị Kiểm tra ràng buộc thuộc tính bảng liệu Đối tượng trigger Kiểm tra tính tồn vẹn liệu nhiều cột nhiều dòng bảng khác 10/03/2015 4.Các dạng ràng buộc toàn vẹn RBTV phương pháp mơ tả Xác định khố chính, khố ngoại, miền giá trị,… mơ tả chúng thời điểm tạo Table Thực trước cho phép thêm vào Table RBTV theo phương pháp thủ tục Xác định tập câu lệnh T-SQL Các lệnh chứa bên đối tượng trigger Được gọi thi hành có thao tác Thêm, xố sửa liệu table tương ứng Thực sau liệu ghi vào Table 5.Bài toán KHACH_HANG(MaKH, TenKhach) PHIEU_XUAT(MAPX, Ngay_PX, #MaKH) CT_PHIEU_XUAT(MAPX, MaHH, SoLuong, DonGia) HANG_HOA(MAHH,Ten_HH, DonGiaHienHanh) KHACH_HANG: khách hàng có mã để phân biệt khách hàng với khách hàng khác, có tên khách hàng HANG_HOA: hàng hố có mã hàng dùng để phân biệt với hàng hố khác, có tên hàng hoá đơn vị bán 10/03/2015 5.Bài toán RB bắt buộc phải sử dụng trigger PHIEU_XUAT: phiếu xuất có mã dùng để phân biệt với phiếu khác, có ngày xuất xác định Một phiếu xuất liên quan đến khách hàng Một phiếu xuất có chi tiết xuất CT_PHIEU_XUAT: chi tiết phiếu xuất có mã phiếu xuất mã hàng hoá dùng để xác định khoá quan hệ Khoá dùng để phân biệt với chi tiết xuất khác, có số lượng xác định, đơn giá tương ứng với đơn giá hành hàng hố lấy từ thuộc tính DonGiaHienHanh bảng HANG_HOA 6.Cơ chế hoạt động Trigger Ba biến cố kích hoạt trigger INSERT UPDATE DELETE Trigger lưu trữ liệu mẩu tin vừa thêm vào table có tên INSERTED Trigger lưu trữ liệu mẩu tin vừa xoá vào table có tên DELETED Trigger lưu trữ liệu mẩu tin vừa cập nhật phối 10 hợp table DELELTED INSERTED 10/03/2015 6.Cơ chế hoạt động Trigger Tạo với trigger CREATE TRIGGER Tên_trigger ON tên_table| tên_view AFTER | INSTEAD OF biến_cố_kích_hoạt_trigger AS Các câu lệnh T-SQL 11 6.Cơ chế hoạt động Trigger Ví dụ 1: CREATE TRIGGER Them_HH ON HANG_HOA AFTER INSERT AS Select * From Inserted Thêm liệu INSERT HANG_HOA(MaHH, TenHH) VALUES(‘TV01’, ‘Tivi Sony’) 12 10/03/2015 6.Cơ chế hoạt động Trigger Ví dụ 2: CREATE TRIGGER SUA_HH ON HANG_HOA AFTER UPDATE AS Select * From Inserted Select * From Deleted Cập nhật liệu UPDATE HANG_HOA SET Ten_HH = ‘Man Hinh Sony’ WHERE MaHH = ‘TV01’ 13 6.Cơ chế hoạt động Trigger Ví dụ 3: CREATE TRIGGER Xoa_HH ON HANG_HOA AFTER DELETE AS Select * From Inserted Select * From Deleted Xóa liệu DELETE HANG_HOA WHERE MaHH = ‘TV01’ 14 10/03/2015 7.Các trigger phổ biến Thêm mẩu tin Xóa mẩu tin Sửa mẩu tin 15 7.1.Thêm mẩu tin Kiểm tra ràng buộc liệu Khoá ngoại Miền giá trị Liên quan hệ Liên thuộc tính bảng Liên thuộc tính nhiều bảng khác 16 10/03/2015 7.1.Thêm mẩu tin Cho lược đồ sau: HOADON_DH(MaHD, NgayDH, MaKH) PHIEU_XUAT(MaPX, NgayXuat, #MaHD ) CHITIET_DH(MAHD, MaHH, SoLuong, DonGia) Xây dựng trigger bảng PHIEU_XUAT để kiểm tra ràng buộc toàn vẹn liệu người dùng thêm thông tin phiếu xuất hàng cho bảng hoá đơn đặt hàng trước Các ràng buộc tồn vẹn liệu bao gồm Khoá ngoại: cần kiểm tra số đặt hàng phải tồn bảng đơn đặt hàng Miền giá trị: cần kiểm tra ngày giao hàng phải sau 17 ngày đặt hàng 7.1.Thêm mẩu tin CREATE TRIGGER tg_PhieuXuat_Insert ON PHIEU_XUAT FOR INSERT AS DECLARE @NgayHD datetime,@ErrMsg varchar(200) Kiểm tra số hố đơn có bảng DONDH không? IF NOT EXISTS(Select * From Inserted I, HOADON_DH D Where I.MaHD= D.MaHD) Begin Rollback Tran Raiserror(‘Số đơn đặt hàng không tồn tại’, 16,1) Return 18 End 10/03/2015 7.1.Thêm mẩu tin Tính ngày đặt hàng Select @NgayDH=NgayDH From HoaDon_DH D, Inserted I Where D.MaHD = I.MaHD Kiểm tra ngày giao hàng phải sau ngày đặt hàng IF @NgayDH > (Select ngayxuat From Inserted) Begin Set @ErrMsg = ‘ngày giao hàng phải sau ngày:’ + Convert(char(10), @ngayDH, 103 ) Raierror(@ErrMsg,16,1) Rollback tran 19 End 7.2.Xóa mẩu tin Kiểm tra ràng buộc Kiểm tra ràng buộc khóa ngoại Ví dụ: xố số hoá đơn đặt hàng bảng HOADON_DH cần phải kiểm tra RBTV liệu sau: Kiểm tra xem đơn đặt hàng bị xoá xuất hàng chưa? Nếu xuất thơng báo khơng thể xố đơn đặt hàng Ngược lại xố liệu liên quan bên bảng chi tiết20đơn đặt hàng (CHITIET_HD) 10 10/03/2015 7.2.Xóa mẩu tin CREATE TRIGGER tg_HOADON_Delete ON HOADON_DH FOR DELETE AS DECLARE @SoPX char(5), @ErrMsg char(200), @Delete_Err int Kiểm tra xem đơn hàng xuất chưa IF EXISTS(Select MaPX From PHIEU_XUAT Where MaHD IN(Select MaHD From Deleted)) Begin Select @MaPX = MaPX From PHIEU_XUAT Where MaHD In(Select MaHD From Deleted) Set @ErrMsg = ‘Đơn đặt hàng nhập theo ’+ ‘số xuất hàng ’+ @SoPX + char(13) + ‘.Không thể huỷ được’ RaiseError(@ErrMsg,16,1) 21 Rollback tran End 7.2.Xóa mẩu tin Else Begin Xoá tự động chi tiết đơn đặt hàng liên quan Delete FROM CHITIET_DH Where MaHD In(Select MaHD From DELETED) Set @Delete_Err = @@ERROR IF @Delete_Err Begin Set @ErrMsg = ‘Lỗi vi phạm xóa bảng chi tiết đặt hàng’ RaisError(@ErrMsg, 16, 1) Rollback Tran End 22 End 11 10/03/2015 7.3.Sửa đổi mẩu tin Kiểm tra ràng buộc liệu Khoá ngoại Miền giá trị Liên quan hệ Liên thuộc tính bảng Liên thuộc tính nhiều bảng khác 23 7.3.Sửa đổi mẩu tin Hàm Update Ý nghĩa • kiểm tra liệu cột bên bảng có bị thay đổi trigger sửa đổi liệu Cú pháp • UPDATE (tên_cột) (biểu thức luận lý) – Tên_cột: tên cột mà muốn kiểm tra xem liệu có bị sửa đổi trigger khơng – Biểu thức luận lý: trả True giá trị liệu 24 cột bị sửa đổi, ngược lại trả False giá trị liệu cột không bị sửa đổi 12 10/03/2015 7.3.Sửa đổi mẩu tin Sửa đổi thông tin số đặt hàng bên bảng HOADON_DH cần phải kiểm tra ràng buộc tồn vẹn liệu sau: Khơng cho phép sửa đổi liệu cột MaDH MaKH liệu ảnh hưởng đến nhiều bảng Sửa đổi giá trị cột ngày đặt hàng phải đảm bảo luôn trước ngày giao hàng số đặt hàng (nếu đơn đặt hàng có giao hàng) 25 7.3.Sửa đổi mẩu tin CREATE TRIGGER tg_HOADON_DH_Update ON HOADON_DH FOR UPDATE AS Declare @MinNgayXH date, @ErrMsg varchar(200) Khi sửa đổi cột MaDH MaKH IF Update(MaDH) OR Update(MaKH) Begin Rollback Tran Set @ErrMsg = ‘Không thể thay đổi số đặt hàng mã khách hàng’ RaisError(@ErrMsg, 16, 1) Return 26 End 13 10/03/2015 7.3.Sửa đổi mẩu tin Khi sửa đổi ngày đặt hàng IF Update(NgayDH) Begin Kiểm tra đơn đặt hàng xuất chưa IF EXISTS (Select MaPX From PHIEU_XUAT PX, Deleted d where px.madh=d.madh) Begin Tính ngày nhập hàng Select @MinNgayXH = Min(NgayXuat) From PHIEU_XUAT PX, DELETED D Where PX.MaDH = D.MaDH 27 7.3.Sửa đổi mẩu tin kiểm tra giá trị ngày đăt hàng sau sửa đổi phải trước ngày giao hàng IF @MinNgayXH < (Select NgayDH From Inserted) Begin Rollback tran Set @ErrMsg = ‘Ngày đặt hàng phải trước ngày:’ + Convert(char(10), @MinNgayXH, 103) RaisError(@ErrMsg, 16, 1) End End 28 End 14 10/03/2015 TRƯỜNG CAO ĐẲNG CÔNG NGHỆ THÔNG TIN THÀNH PHỐ HỒ CHÍ MINH 15 ... INSERTED 10/03/2015 6. Cơ chế hoạt động Trigger Tạo với trigger CREATE TRIGGER Tên_trigger ON tên_table| tên_view AFTER | INSTEAD OF biến_cố_kích_hoạt_trigger AS Các câu lệnh T -SQL 11 6. Cơ chế hoạt... tục Xác định tập câu lệnh T -SQL Các lệnh chứa bên đối tượng trigger Được gọi thi hành có thao tác Thêm, xố sửa liệu table tương ứng Thực sau liệu ghi vào Table 5 .Bài toán KHACH_HANG(MaKH,... Rollback Tran Set @ErrMsg = ‘Không thể thay đổi số đặt hàng mã khách hàng’ RaisError(@ErrMsg, 16, 1) Return 26 End 13 10/03/2015 7.3.Sửa đổi mẩu tin Khi sửa đổi ngày đặt hàng IF Update(NgayDH) Begin