Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 22 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
22
Dung lượng
1,88 MB
Nội dung
KHOA CÔNG NGHỆ THÔNG TIN Chương TRIGGER VÀ TRANSACTION LOGO I TRIGGER DMMON(Mamon, Tenmon, Sodvht) DMLOP(Malop,Tenlop,Siso) SINHVIEN(Masv, HoTen, Malop, Gioitinh, Ngaysinh, SoDvhtDuoi5 ) DIEMHP(Masv, Mamon,DiemHP) 1.Bài toán sử dụng Triger Tạo Trigger thêm sinh viên bảng SINHVIEN lớp cột Siso lớp bảng DMLOP tự động tăng lên (ngược lại xóa) Khi thêm sinh viên vào bảng DIEMHP có DiemHP Bảng inserted/ deleted chứa nhiều dòng Cú pháp CREATE TRIGGER tên_trigger ON tên_bảng FOR {[INSERT][,][UPDATE][,][DELETE]} AS [IF UPDATE(tên_cột) [AND UPDATE(tên_cột)|OR UPDATE(tên_cột)] ] các_câu_lệnh_của_trigger Update(tên_cột) = true : có thực cập nhật cột Lưu ý: Lưu ý: - Lệnh tạo trigger phải lệnh query batch - Trên bảng định nghĩa nhiều trigger for cho thao tác… - Có thể xử lý quay lui thao tác thực lệnh lệnh rollback transaction để bảo toàn liệu gặp lỗi Ví dụ: Tạo Trigger cho thêm sinh viên vào bảng SINHVIEN SiSo lớp tương ứng bảng DMLOP tự động tăng lên Bảng tầm ảnh hưởng Thêm (Insert) Xóa (Delete) Sửa (Update) SINHVIEN + - - DMLOP - - + (Siso) 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 Thực lệnh chèn thêm sinh viên cho lớp CT11 với 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 Trigger FOR Insert tự động thực hiện, Dữ liệu nhập thêm đưa vào bảng INSERTED, thực nhóm lệnh cập nhật Siso lớp vừa thêm bảng DMLOP Ví dụ: Tạo Trigger cho xóa sinh viên từ bảng SINHVIEN SiSo lớp tương ứng bảng DMLOP tự động giảm xuống Bảng tầm ảnh hưởng Thêm (Insert) Xóa (Delete) Sửa (Update) SINHVIEN - + - DMLOP - - + (Siso) 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 Sử dụng mệnh đề IF UPDATE() … END trigger Trong trường hợp định Trigger UPDATE ta phải dùng mệnh đề IF UPDATE() để định cột cập nhật thực nhóm lệnh Ví dụ: Tạo Trigger cho sửa Malop sinh viên bảng SINHVIEN SiSo lớp tương ứng bảng DMLOP tự động thay đổi Thêm (Insert) Xóa (Delete) Sửa (Update) SINHVIEN - - +(MaLop) DMLOP - - + (Siso) Create TRIGGER Trg_SINHVIEN_update ON SINHVIEN FOR UPDATE AS IF UPDATE(Malop) Begin UPDATE DMLOP SET DMLOP.Siso=DMLOP.Siso-1 FROM DELETED Where DMLOP.Malop=DELETED.Malop /*Tăng cột siso lớp thany đổi lên 1*/ UPDATE DMLOP SET DMLOP.Siso=DMLOP.Siso+1 FROM INSERTED Where DMLOP.Malop=INSERTED.Malop End ROLLBACK TRANSACTION trigger Để phát huỷ bỏ thao tác không đảm bảo tính tồn vẹn liệu Trong trigger, để huỷ bỏ tác dụng 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 Trigger đảm bảo tính tồn ven liệu thêm sinh viên bảng SINHVIEN sinh viên phải cáo bảng DMLOP Create TRIGGER Trg_SINHVIEN_insert2 ON SINHVIEN FOR INSERT AS IF Not Exists(Select * From DMLOP,INSERTED WHERE DMLOP.Malop=INSERTED.Malop) ROLLBACK TRANSACTION Else UPDATE DMLOP SET DMLOP.Siso=DMLOP.Siso+1 FROM INSERTED Where DMLOP.Malop=INSERTED.Malop Create TRIGGER Trg_SINHVIEN_update ON SINHVIEN FOR UPDATE AS IF UPDATE(Malop) Begin IF Not Exists(Select * From DMLOP,INSERTED WHERE DMLOP.Malop=INSERTED.Malop) ROLLBACK TRANSACTION Else Begin UPDATE DMLOP SET DMLOP.Siso=DMLOP.Siso-1 FROM DELETED Where DMLOP.Malop=DELETED.Malop UPDATE DMLOP SET DMLOP.Siso=DMLOP.Siso+1 FROM INSERTED Where DMLOP.Malop=INSERTED.Malop End End Thực 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ó bảng DMLOP Thực ROLLBACK TRANSACTION huỷ bỏ tác dụng câu lệnh làm kích hoạt trigger (1) (2) Kết quả: (0 row(s) affected) (0 row(s) affected) (0 row(s) affected) Trigger tác động nhiều dòng Thực lệnh INSERT, DELETE VÀ UPDATE nhiều dịng Ví dụ: Hãy tạo Trigger cho sửa Malop sinh viên bảng SINHVIEN SiSo lớp tương ứng bảng DMLOP tự động thay đổi Create TRIGGER trg_SINHVIEN_update_Siso ON SINHVIEN FOR UPDATE AS IF UPDATE(Malop) Begin IF Not Exists(Select * From DMLOP,INSERTED WHERE DMLOP.Malop=INSERTED.Malop) ROLLBACK TRANSACTION Else Begin UPDATE DMLOP SET Siso = Siso - (SELECT Count(DELETED.Masv) FROM DELETED) WHERE Malop IN (SELECT Malop FROM DELETED) UPDATE DMLOP SET Siso = Siso + (SELECT Count(INSERTED.Masv) FROM INSERTED) WHERE Malop IN (SELECT Malop FROM INSERTED) End End Bài tập: 1.Tạo Trigger cho thêm MỘT sinh viên vào bảng SINHVIEN SiSo lớp tương ứng bảng DMLOP tự động tăng lên 2.Tạo Trigger cho xóa MỘT sinh viên từ bảng SINHVIEN SiSo lớp tương ứng bảng DMLOP tự động giảm xuống 3.Tạo Trigger cho sửa MỘT sinh viên bảng SINHVIEN SiSo lớp tương ứng bảng DMLOP tự động thay đổi 4.Tạo Trigger cho xóa NHỮNG sinh viên từ bảng SINHVIEN SiSo lớp tương ứng bảng DMLOP tự động giảm xuống 5.Tạo Trigger cho sửa NHỮNG sinh viên bảng SINHVIEN SiSo lớp tương ứng bảng DMLOP tự động thay đổi Yêu cầu: Dùng RollBack Transaction để kiểm tra điều kiện đảm bảo tính tồn vẹn liệu bảng liệu thay đổi II TRANSACTION –GIAO TÁC 1.Khái niệm: Giao tác (Transaction) tập hợp có thứ tự thao tác chúng thành cơng, thất bại Nghĩa là: có thao tác khơng hồn thành tồn giao tác khơng hồn thành Vì phải dùng giao tác: Xét ví dụ sau: Chuyển khoản $100 từ tài khoản A ->B - Trừ tiền tài khoản A $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 bị cúp điện lệnh ‘cộng thêm’ bj lỗi tài khoản B khơng có thêm tiền 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 bị điện lệnh ‘Xóa’ bị lỗi sinh viên cịn danh sách Khắc phục Đưa nhóm lệnh vào từ khóa Begin … Rollback sau: Begin [transaction] Rollback [transaction/tran] | Commit [transaction/tran] Ví dụ: Begin Transaction Insert into SV_NGUNGTD (Masv, Hoten, Malop, Ngaysinh, Gioitinh) (Select Masv, Hoten, Malop, Ngaysinh, Gioitinh From SINHVIEN Where TongDVHTduoi5