Professional Documents
Culture Documents
Chương 6
TRIGGER VÀ TRANSACTION
LOGO
I. TRIGGER
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
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
Thêm Xóa Sửa
(Insert) (Delete) (Update)
SINHVIEN - + -
DMLOP - - + (Siso)
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 của 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 và trigger
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 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 DMLOP
Thự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)
3. Trigger tác động trên 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.
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 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
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 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.
Khắc phục
Ví dụ:
Begin Transaction
Insert into SV_NGUNGTD (Masv, Hoten, Malop, Ngaysinh,
Gioitinh)
(Select Masv, Hoten, Malop, Ngaysinh, Gioitinh From SINHVIEN
Where TongDVHTduoi5<25)
Delete From SINHVIEN Where TongDVHTduoi5<25
Commit Transaction
Create PROC usp_Inserrt_SinhVien
@masv varchar(10), @HoTen nvarchar(30),
@Dienthoai varchar(7),@maLop varchar(10) ,Ngaysinh Date
@tbloi varchar(30)=null output
AS
BEGIN TRANSACTION
IF(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 -1
end