Buoi 8

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 18

Chương V: Ngôn ngữ lập trình

trong hệ quản trị cơ sở dữ liệu


4. Đảm bảo tính toàn vẹn dữ liệu bằng bẫy sự kiện (trigger)
Trigger
❖Trigger là một loại stored procedure đặc biệt có các đặc điểm sau:
- Tự động thực hiện khi có thao tác insert, delete hoặc update trên dữ
liệu.
- Thường dùng để kiểm tra các ràng buộc toàn vẹn của CSDL hoặc các
qui tắc nghiệp vụ.
- Một trigger được định nghĩa trên một bảng, nhưng các xử lý trong
trigger có thể sử dụng nhiều bảng khác.
Trigger
❖ Các xử lý bên trong trigger
❑ Kiểm tra các ràng buộc dữ liệu phức tạp
✓ Các ràng buộc mô tả phức tạp, không thể dung constraint
✓ Gọi hành động Rollback Tran để hủy thao tác cập nhật khi vi phạm ràng
buộc
✓ Bảo đảm dữ liệu luôn được toàn vẹn
✓ Bảo đảm việc kiểm thử ứng dụng không làm hư dữ liệu có sẵn
❑ Tính toán, tự động cập nhật giá trị
✓ Bổ sung các hành động cập nhật dữ liệu để đảm bảo tính toàn vẹn dữ liệu
✓ Đơn giản hoá việc xây dựng ứng dụng
❑ Chỉ định các bẫy lỗi dễ hiểu
✓ Tăng tính thân thiện của ứng dụng
✓ Dễ dàng nhận ra các lỗi khi lập trình
Trigger
❖Xử lý của trigger thường cần sử dụng đến hai bảng tạm:
✓ Inserted: chứa các dòng vừa mới được thao tác insert/ update thêm vào
bảng.
✓ Deleted: chứa các dòng vừa mới bị xóa khỏi bảng bởi thao tác update/delete.
Lưu ý: update = delete dòng chứa giá trị cũ + insert dòng chứa giá trị mới
✓ Inserted và deleted là các bảng trong bộ nhớ chính:
o Cục bộ cho mỗi trigger.
o Có cấu trúc giống như bảng (table) mà trigger định nghĩa trên đó
o Chỉ tồn tại trong thời gian trigger đang xử lý.

✓ 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:

❑Trigger thông thường: AFTER (FOR) trigger

✓ Chạy sau các hành động kiểm tra dữ liệu của các Rule Constraint.

✓ Dữ liệu đã bị tạm thời thay đổi trong bảng

❑ INSTEAD OF trigger

✓ Chạy trước các hành động kiểm tra dữ liệu

✓Dữ liệu chưa hề bị thay đổi

✓ 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

You might also like