Professional Documents
Culture Documents
Buoi 8
Buoi 8
Buoi 8
✓ Nếu thao tác insert/ delete/ update thực hiện trên nhiều dòng, trigger cũng chỉ
được gọi một lần. Bảng inserted/ deleted có thể chứa nhiều dòng
Các loại Trigger
❖Có 2 loại trigger:
✓ Chạy sau các hành động kiểm tra dữ liệu của các Rule Constraint.
❑ INSTEAD OF trigger
✓ Có thể thay thế hành động cập nhật dữ liệu bằng các hành động khác.
Làm việc với Trigger
❖Tạo mới trigger
✓Trigger có thể được tạo bằng câu lệnh hoặc bằng SQL Server Management
Studio
✓Trong cả hai trường hợp, câu lệnh CREATE TRIGGER được sử dụng để tạo
ra trigger
CREATE TRIGGER Tên_Trigger ON Tên_bảng
{ [ INSTEAD OF ] | [ FOR | AFTER ] }
{ [ INSERT [, UPDATE [,DELETE ] ] ] }
AS
[DECLARE Biến_cục_bộ]
Các_lệnh
Mô tả câu lệnh trigger
❖Tên bảng
✓Tên bảng mà trigger tạo mới sẽ liên kết
❖ INSTEAD OF: chỉ định đây là trigger loại instead of trigger
✓ Mỗi bảng chỉ có quyền tạo một instead of trigger cho một hành động cập
nhật
❖ FOR hoặc AFTER
✓ Nếu tạo trigger thông thường
❖ INSERT, UPDATE, DELETE
✓ Hành động cập nhật dữ liệu tác động vào bảng để kích hoạt trigger.
Làm việc với Trigger
❖Xoá trigger
DROP TRIGGER Tên_trigger
❖Sửa nội dung
ALTER TRIGGER Tên_Trigger ON Tên_bảng
FOR INSERT [, UPDATE [,DELETE ]]
AS
[DECLARE Biến_cục_bộ]
Các_lệnh
Trigger – kiểm tra ràng buộc dữ
liệu
❖Khi thêm mới mẫu tin
✓Thường dùng để kiểm tra
o Khóa ngoại, Miền giá trị, Liên thuộc tính trong cùng một bảng
o Liên thuộc tính của nhiều bảng khác nhau
✓3 loại đầu tiên, chỉ dùng trigger nếu muốn cung cấp các báo lỗi cụ thể
bằng tiếng Việt
o Nếu đã khai báo các ràng buộc này bằng constraint
✓Các cấu trúc lệnh thường dùng khi kiểm tra
o If Else
o If Exists
o Raiserror
o Rollback Tran
Trigger – kiểm tra ràng buộc dữ
liệu
❖Khi hủy bỏ mẫu tin
✓Tương tự, kiểm tra các ràng buộc như trigger INSERT
✓ Nên kiểm tra ràng buộc khoá ngoại
oThông thường ràng buộc này dẫn đến việc phải cập nhật
một số dữ liệu trên bảng khác
oChú ý: thuộc tính CASCADE DELETE
Sử dụng trigger cài đặt một số
loại ràng buộc
❖Ví dụ 1- Ràng buộc liên thuộc tính – liên quan hệ
Cho CSDL:
DatHang(MaDH, NgayDH,…)
GiaoHang(MaGH, MaDH, NgayGH,…)
Ràng buộc: Ngày giao hàng không thể nhỏ hơn ngày đặt hàng tương ứng
Bảng tầm ảnh hưởng:
Thêm Xoá Sửa
DatHang - - + (NgayDH)
GiaoHang + - + (NgayGH, MaDH)
→Cần cài đặt trigger cho thao tác sửa trên bảng DatHang, và thêm/sửa
trên bảng GiaoHang
Sử dụng trigger cài đặt một số
loại ràng buộc
❖Ví dụ 1- Ràng buộc liên thuộc tính – liên quan hệ
Trigger cho thao tác thêm và sửa trên giao hàng:
CREATE TRIGGER tr_GH_ins_upd_NgayGH
ON GiaoHang FOR INSERT, UPDATE
AS
IF UPDATE (MaDH) OR UPDATE (NgayGH)
IF EXISTS (SELECT * FROM INSERTED i, DatHang d
WHERE i.MaPDH = d.MaPDH
AND i.NgayGH<d.NgayDH)
Sử dụng trigger cài đặt một số
loại ràng buộc
❖Ví dụ 1- Ràng buộc liên thuộc tính – liên quan hệ
Trigger cho thao tác thêm và sửa trên giao hàng:
BEGIN
RAISERROR (N‘Ngày GH không thể nhỏ hơn ngày ĐH’,0,1)
ROLLBACK tran
END
GO
Bài tập: Trigger cho thao tác sửa trên đặt hàng.
Sử dụng trigger cài đặt một số
loại ràng buộc
❖Ví dụ 2 – Ràng buộc toàn vẹn liên bộ
❖Xét LĐQH: KetQua(MASV, MAMH, LANTHI, DIEM)
Tạo trigger kiểm tra RBTV: “Sinh viên chỉ được thi tối đa 2 lần
cho một môn học”
✓ Xác định bảng tầm ảnh hưởng:
Insert Delete Update
KetQua - - + (MaSV, MaMH)
Sử dụng trigger cài đặt một số
loại ràng buộc
❖Ví dụ 2 – Ràng buộc toàn vẹn liên bộ
✓Cài đặt trigger dựa trên bảng tầm ảnh hưởng
-- Tao trigger ung voi thao tac insert tren bang KetQua
CREATE TRIGGER trg_KetQua_insert
ON KetQua
FOR INSERT
AS
DECLARE @SoLanThi INT
SELECT @SoLanThi=COUNT(*)
FROM KetQua K, INSERTED I
WHERE I.MaSV=K.MaSV AND I.MaMH = K.MaMH
Sử dụng trigger cài đặt một số
loại ràng buộc
❖Ví dụ 2 – Ràng buộc toàn vẹn liên bộ
✓Cài đặt trigger dựa trên bảng tầm ảnh hưởng
-- Tao trigger ung voi thao tac insert tren bang KetQua
IF @SoLanThi > 2
BEGIN
RAISERROR('So lan thi phai <= 2', 0,1)
ROLLBACK TRANSACTION
END
Bài tập: Tạo trigger ứng với thao tac Update trên bảng KetQua
Sử dụng trigger cài đặt một số
loại ràng buộc
❖Ví dụ 3: Trigger cho việc thực hiện một thao tác cập nhật dữ liệu
nào đó.
❖Cho quan hệ
CHI_TIET_HOA_DON(MaHD,STT, MaMH, SoLuong, DonGia,
ThanhTien).
Viết trigger thực hiện cập nhật giá trị của ThanhTien khi thêm một chi
tiết hóa đơn
Sử dụng trigger cài đặt một số
loại ràng buộc
CREATE TRIGGER trg_TinhTien_CTHD
ON CTHD
FOR INSERT, UPDATE
AS
BEGIN
UPDATE CTHD
SET ThanhTien = SoLuong*DnGia
WHERE EXISTS ( SELECT * FROM INSERTED I
WHERE CTHD.MaHD=I.MaHD AND
CTHD.STT=I.STT)
END