1.Bài toán sử dụng TrigerTạo một Trigger khi thêm một sinh viên trong bảng SINHVIEN ở một lớp nào đó thì cột Siso của lớp đó trong bảng DMLOP tự động tăng lên 1 ngược lại khi xóa Khi th
Trang 1Chương 6 TRIGGER VÀ TRANSACTION
KHOA CÔNG NGHỆ THÔNG TIN
Trang 21.Bài toán sử dụng Triger
Tạo một Trigger khi thêm một sinh viên trong bảng
SINHVIEN ở một lớp nào đó thì cột Siso của lớp đó trong bảng DMLOP tự động tăng lên 1 (ngược lại khi xóa)
Khi thêm một sinh viên vào bảng DIEMHP có DiemHP
<5 của môn học nào đó thì cột TongSdvhtduoi5 của bảng SINHVIEN tự động cộng thêm số đơn vị ht của môn học đó (Ngược lại khi xóa)
Trang 32 Khái niệm:
Trigger là một loại stored procedure đặc biệt
- 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
Trang 43 Xử lý của Trigger
Xử lý của trigger thường cần sử dụng đến hai BẢNG tạm thời:
–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
INSERTED VÀ DELETED là hai bảng trong bộ nhớ
chính 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
Trang 6- Có thể xử lý quay lui thao tác đã thực hiện lệnh bằng
lệnh rollback transaction để bảo toàn dữ liệu khi gặp lỗi.
Trang 7Ví dụ: Tạo một Trigger sao cho khi thêm một sinh viên mới vào bảng SINHVIEN thì SiSo của lớp tương ứng trong bảng DMLOP tự động tăng lên 1
Bảng tầm ảnh hưởng
Thêm (Insert)
Xóa (Delete)
Sửa (Update)
Create TRIGGER Trg_SINHVIEN_insert
ON SINHVIEN FOR INSERT
AS UPDATE DMLOP SET DMLOP.Siso=DMLOP.Siso+1 FROM INSERTED
Where DMLOP.Malop=INSERTED.Malop
Trang 8Thực hiện lệnh chèn thêm sinh viên mới cho lớp CT11 với
bộ giá trị là(‘0020’,’Nguyễn Van Anh’,CT11)
INSERT INTO SINHVIEN(Masv,Hoten,Malop)
Values (‘0020,N’Nguyễn Văn Anh’,’CT11’)
Khi lệnh Insert thực thi thì một Trigger FOR Insert sẽ tự động thực hiện, Dữ liệu nhập thêm sẽ được đưa vào bảng INSERTED, thực hiện nhóm lệnh cập nhật Siso của lớp vừa thêm trong bảng DMLOP
Trang 9 Ví dụ: Tạo một Trigger sao cho khi xóa một sinh viên mới từ bảng SINHVIEN thì SiSo của lớp tương ứng trong bảng DMLOP tự động giảm xuống 1
Bảng tầm ảnh hưởng
Create TRIGGER Trg_SINHVIEN_delete
ON SINHVIEN FOR DELETE
AS UPDATE DMLOP SET DMLOP.Siso=DMLOP.Siso-1 FROM DELETED
Where DMLOP.Malop=DELETED.Malop
Thêm (Insert)
Xóa (Delete)
Sửa (Update)
Trang 10Sử dụng mệnh đề IF UPDATE() … END trong trigger
Trong trường hợp chỉ định một Trigger UPDATE thì ta phải dùng mệnh đề IF UPDATE(<Cột>) để chỉ định cột được cập nhật thì mới thực hiện nhóm lệnh.
Ví dụ:
Tạo ra Trigger sao cho khi sửa Malop một sinh viên trong bảng SINHVIEN thì SiSo của lớp tương ứng trong bảng DMLOP tự động thay đổi.
Thêm (Insert)
Xóa (Delete)
Sửa (Update)
Trang 11Create TRIGGER Trg_SINHVIEN_update
SET DMLOP.Siso=DMLOP.Siso+1
FROM INSERTED
Where DMLOP.Malop=INSERTED.Malop End
Trang 12ROLLBACK TRANSACTION và trigger
Để phát hiện và huỷ bỏ những thao tác không đảm bảo tính toàn vẹn dữ liệu Trong một trigger, để huỷ bỏ tác dụng
của câu lệnh làm kích hoạt trigger, ta sử dụng câu lệnh:
ROLLBACK TRANSACTION
Ví dụ: Tạo một Trigger đảm bảo tính toàn ven dữ liệu khi thêm một sinh viên mới trong bảng SINHVIEN thì sinh viên đó phải cáo trong bảng DMLOP
Trang 13Create TRIGGER Trg_SINHVIEN_insert2
Trang 14Create TRIGGER Trg_SINHVIEN_update
Where DMLOP.Malop=DELETED.Malop UPDATE DMLOP
SET DMLOP.Siso=DMLOP.Siso+1 FROM INSERTED
Where DMLOP.Malop=INSERTED.Malop End
End
Trang 15Thực hiện lệnh Update
Update SINHVIEN
Set Malop='CT14' Where Masv='023‘
Đưa dòng sinh viên 023 lớp CT14 vào bảng INSERTED (1)Đưa dòng sinh viên 023 lớp cũ (‘CT12’ vào bảng DELETED (2)Kiểm tra điều kiện mã lớp CT14 không có trong bảng DMLOPThực hiện ROLLBACK TRANSACTION huỷ bỏ tác dụng của câu lệnh làm kích hoạt trigger (1) và (2)
Kết quả:
(0 row(s) affected)
(0 row(s) affected)
(0 row(s) affected)
Trang 163 Trigger tác động trên nhiều dòng
Thực hiện lệnh INSERT, DELETE VÀ UPDATE nhiều dòng
Ví dụ: Hãy tạo ra Trigger sao cho khi sửa Malop những
sinh viên trong bảng SINHVIEN thì SiSo của lớp tương ứng trong bảng DMLOP tự động thay đổi
Trang 17Create TRIGGER trg_SINHVIEN_update_Siso
Trang 18Bài tập:
1.Tạo một Trigger sao cho khi thêm MỘT sinh viên mới
vào bảng SINHVIEN thì SiSo của lớp tương ứng trong bảng
DMLOP tự động tăng lên 1
2.Tạo một Trigger sao cho khi xóa MỘT sinh viên từ bảng SINHVIEN thì SiSo của lớp tương ứng trong bảng DMLOP tự động giảm xuống 1
3.Tạo một Trigger sao cho khi sửa MỘT sinh viên trong
bảng SINHVIEN thì SiSo của lớp tương ứng trong bảng DMLOP
Trang 19II TRANSACTION –GIAO TÁC
1 Khái niệm:
Giao tác (Transaction) là một tập hợp có thứ tự các thao tác và chúng chỉ có thể cùng nhau thành công, hoặc cùng nhau thất bại Nghĩa là: nếu có một thao tác không hoàn thành
được thì toàn bộ giao tác cũng không hoàn thành
Vì sao phải dùng giao tác:
Xét ví dụ sau:
1 Chuyển khoản $100 từ tài khoản A ->B
- Trừ tiền tài khoản A đi $100
- Công thêm tiền vào tài khoản B
Giả sử trừ tiền tài khoản A xong thì bị cúp điện hoặc lệnh
‘cộng thêm’ bj lỗi khi đó tài khoản B không có thêm tiền.
2 Chuyển sinh viên A từ lớp CT11 xuống lớp CT12
- Thêm sinh viên A vào bảng DANHSACHTL
- Xóa sinh viên A từ bảng SINHVIEN
Giả sử vừa thêm sinh viên A thì bị mất điện hoặc lệnh
‘Xóa’ bị lỗi như vậy sinh viên vẫn còn trong danh sách
Trang 22Create PROC usp_Inserrt_SinhVien
@masv varchar(10), @HoTen nvarchar(30),
@Dienthoai varchar(7),@maLop varchar(10) ,Ngaysinh Date
@tbloi varchar(30)=null output
INSERT INTO SINHVIEN(Masv, HoTen, Dienthoai, MaLop)
VALUES(@Masv, @HoTen, @Dienthoai, @MaLop)
RETURN 0 /* procedure tự trả về 0 nếu không RETURN */