chương 6 trigger vÀ transaction

22
LOGO Chương 6 Chương 6 TRIGGER VÀ TRANSACTION TRIGGER VÀ TRANSACTION KHOA CÔNG NGHỆ THÔNG TIN

Upload: meda

Post on 04-Jan-2016

66 views

Category:

Documents


0 download

DESCRIPTION

KHOA CÔNG NGHỆ THÔNG TIN. Chương 6 TRIGGER VÀ TRANSACTION. 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 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Chương 6 TRIGGER VÀ TRANSACTION

LOGO

Chương 6Chương 6TRIGGER VÀ TRANSACTIONTRIGGER VÀ TRANSACTION

KHOA CÔNG NGHỆ THÔNG TIN

Page 2: Chương 6 TRIGGER VÀ TRANSACTION

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 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ê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)

Page 3: Chương 6 TRIGGER VÀ TRANSACTION

2. 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.

Page 4: Chương 6 TRIGGER VÀ TRANSACTION

3. Xử lý của TriggerXử 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

Page 5: Chương 6 TRIGGER VÀ TRANSACTION

4. Cú phápCREATE 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 hiện cập nhật trên cột <tên_cột>

Lưu ý:

Page 6: Chương 6 TRIGGER VÀ TRANSACTION

Lưu ý:- Lệnh tạo trigger phải là lệnh đầu tiên trong một query

batch - Trên một bảng có thể định nghĩa nhiều trigger for cho

mỗi thao tác… - 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.

Page 7: Chương 6 TRIGGER VÀ TRANSACTION

Ví 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 1Bả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

Page 8: Chương 6 TRIGGER VÀ TRANSACTION

Thự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

Page 9: Chương 6 TRIGGER VÀ TRANSACTION

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 1Bảng tầm ảnh hưởng

Create TRIGGER Trg_SINHVIEN_deleteON SINHVIEN FOR DELETEAS UPDATE DMLOP SET DMLOP.Siso=DMLOP.Siso-1 FROM DELETED Where DMLOP.Malop=DELETED.Malop

Thêm(Insert)

Xóa(Delete)

Sửa (Update)

SINHVIEN - + -

DMLOP - - + (Siso)

Page 10: Chương 6 TRIGGER VÀ TRANSACTION

Sử 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)

SINHVIEN - - +(MaLop)

DMLOP - - + (Siso)

Page 11: Chương 6 TRIGGER VÀ TRANSACTION

Create TRIGGER Trg_SINHVIEN_updateON SINHVIEN FOR UPDATE AS IF UPDATE(Malop)BeginUPDATE DMLOP SET DMLOP.Siso=DMLOP.Siso-1 FROM DELETED Where DMLOP.Malop=DELETED.Malop /*Tăng cột siso của lớp thany đổi lên 1*/ UPDATE DMLOP SET DMLOP.Siso=DMLOP.Siso+1 FROM INSERTEDWhere DMLOP.Malop=INSERTED.Malop End

Page 12: Chương 6 TRIGGER VÀ TRANSACTION

ROLLBACK 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 TRANSACTIONVí 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.

Page 13: Chương 6 TRIGGER VÀ TRANSACTION

Create TRIGGER Trg_SINHVIEN_insert2 ON SINHVIEN FOR INSERT AS

UPDATE DMLOP SET DMLOP.Siso=DMLOP.Siso+1 FROM INSERTED Where DMLOP.Malop=INSERTED.Malop

IF Not Exists(Select * From DMLOP,INSERTED WHERE DMLOP.Malop=INSERTED.Malop) ROLLBACK TRANSACTIONElse

Page 14: Chương 6 TRIGGER VÀ TRANSACTION

Create TRIGGER Trg_SINHVIEN_updateON SINHVIEN FOR UPDATE AS IF UPDATE(Malop)Begin

IF Not Exists(Select * From DMLOP,INSERTED WHERE DMLOP.Malop=INSERTED.Malop) ROLLBACK TRANSACTIONElseBegin

UPDATE DMLOP SET DMLOP.Siso=DMLOP.Siso-1 FROM DELETED Where DMLOP.Malop=DELETED.Malop UPDATE DMLOP SET DMLOP.Siso=DMLOP.Siso+1 FROM INSERTEDWhere DMLOP.Malop=INSERTED.Malop

EndEnd

Page 15: Chương 6 TRIGGER VÀ TRANSACTION

Thự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)

Page 16: Chương 6 TRIGGER VÀ TRANSACTION

3. 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.

Page 17: Chương 6 TRIGGER VÀ TRANSACTION

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

ElseBegin 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) EndEnd

Page 18: Chương 6 TRIGGER VÀ TRANSACTION

Bà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 tự động thay đổi.

4.Tạo một Trigger sao cho khi xóa NHỮNG 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.

5.Tạo một Trigger sao cho khi sửa 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

Yêu cầu: Dùng RollBack Transaction để kiểm tra điều kiện đảm bảo tính toàn vẹn dữ liệu của 2 bảng khi dữ liệu thay đổi

Page 19: Chương 6 TRIGGER VÀ TRANSACTION

II. 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 BGiả 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.

Page 20: Chương 6 TRIGGER VÀ TRANSACTION

Khắc phục

Đưa nhóm lệnh vào từ khóa Begin … Rollback như sau:Begin [transaction]<nhóm lệnh>Rollback [transaction/tran]| Commit [transaction/tran]

Ví dụ:Begin TransactionInsert into SV_NGUNGTD (Masv, Hoten, Malop, Ngaysinh,

Gioitinh)(Select Masv, Hoten, Malop, Ngaysinh, Gioitinh From SINHVIEN

Where TongDVHTduoi5<25)Delete From SINHVIEN Where TongDVHTduoi5<25Commit Transaction

Page 21: Chương 6 TRIGGER VÀ TRANSACTION
Page 22: Chương 6 TRIGGER VÀ TRANSACTION

Create PROC usp_Inserrt_SinhVien @masv varchar(10), @HoTen nvarchar(30),@Dienthoai varchar(7),@maLop varchar(10) ,Ngaysinh Date@tbloi varchar(30)=null outputAS BEGIN TRANSACTIONIF(EXISTS(SELECT * FROM SINHVIEN sv WHERE sv.Masv = @Masv)) BEGIN set @tbloi= N'Mã số sinh viên ' + @Masv + N' đã tồn tại' RETURN -1 END IF(NOT EXISTS(SELECT * FROM DMLOP l WHERE l.MaLop = @MaLop)) BEGIN set @tbloi= N'Mã số lớp ' + @MaLop + N' chưa tồn tại' RETURN -1 END INSERT INTO SINHVIEN(Masv, HoTen, Dienthoai, MaLop) VALUES(@Masv, @HoTen, @Dienthoai, @MaLop) RETURN 0 /* procedure tự trả về 0 nếu không RETURN */ END If(@@error<>0) begin Rollback transaction return -1end