You are on page 1of 4

Bài tập về Trigger Bài tập về Trigger Bài tập về Trigger Bài tập về

Trigger

------------------------------TRANSACTION
---------------------------------------------
TRANSACTION trong SQL là tiến trình thực hiện một nhóm các câu lệnh SQL.
Các câu lệnh này được thực thi một cách tuần tự và độc lập.
Một Transaction được thực hiện thành công khi tất cả câu lệnh đều thành công,
khi đó tất cả các thay đổi dữ liệu được thực hiện trong Transaction được lưu vào cơ
sở dữ liệu.
Tuy nhiên, nếu chỉ một trong số đó thất bại thì toàn bộ tiến trình sẽ thất bại,
đồng nghĩa với việc dữ liệu phải rollback về trạng thái ban đầu
(dữ liệu được khôi phục về trạng thái trước khi thực hiện Transaction).

Trong SQL, có các lệnh sau được sử dụng để điều khiển Transaction:
COMMIT : để lưu các thay đổi.
ROLLBACK: để quay trở lại trạng thái trước khi có thay đổi.

------------------------------- FOR INSERT


-----------------------------------------------
CREATE TRIGGER TRIG_CAUTHU ON CAUTHU
FOR INSERT
AS
DECLARE @HOTEN NVARCHAR(100);
DECLARE @VITRI NVARCHAR(50);
DECLARE @NGAYSINH DATE;
DECLARE @DIACHI NVARCHAR(200);
DECLARE @MACLB VARCHAR(5);
DECLARE @MAQG VARCHAR (5);
DECLARE @SO INT;
BEGIN
-- Lấy thông tin dữ liệu đầu vào và set giá trị vào biến.

SELECT @HOTEN = a.HOTEN, @VITRI = a.VITRI, @NGAYSINH =a.NGAYSINH,


@DIACHI =a.DIACHI, @MACLB =a.MACLB,@MAQG =a.MAQG,@SO=a.SO FROM INSERTED a;

-- khi thêm mới một dữ liệu thì trước tiên dữ liệu sẽ được đưa vào bảng
INSERTED

IF (@VITRI = N'Thủ môn' OR


@VITRI = N'Tiền Đạo' OR
@VITRI = N'Tiền vệ' OR
@VITRI = N'Trung vệ' OR
@VITRI = N'Hậu vệ' )
BEGIN
DECLARE @SO_LUONG INT;
-- kiểm tra số áo
SELECT @SO_LUONG = COUNT(*) FROM CAUTHU A WHERE A.SO=@SO AND
A.MACLB=@MACLB;
IF @SO_LUONG = 0
BEGIN
DECLARE @CAU_THU_NUOC_NGOAI INT;
-- kiểm tra số lượng cầu thủ nước ngoài ở mỗi câu lạc
bộ chỉ được phép đăng ký tối đa 8 cầu thủ.
SELECT @CAU_THU_NUOC_NGOAI = COUNT(*) FROM CAUTHU C
JOIN CAULACBO B ON C.MACLB = B.MACLB
WHERE C.MACLB=@MACLB AND C.MAQG <> 'VN';

IF @CAU_THU_NUOC_NGOAI <= 8
BEGIN
DECLARE @error INT;
INSERT INTO CAUTHU VALUES
(@HOTEN,@VITRI,@NGAYSINH,@DIACHI,@MACLB,@MAQG,@SO);
SELECT @error = @@ERROR;
IF @error = 0
BEGIN
COMMIT TRANSACTION;
PRINT N'Đã thêm cầu thủ mới';
END
ELSE
BEGIN
PRINT N'Xảy ra lỗi khi thêm
cầu thủ mới';
ROLLBACK TRANSACTION;
END
END
ELSE
BEGIN
PRINT N'SỐ LƯỢNG CẦU THỦ NGOẠI QUỐC VƯỢT
QUÁ 8';
ROLLBACK TRANSACTION;
END
END
ELSE
BEGIN
PRINT N'ĐÃ TỒN TẠI SỐ ÁO: '+CAST(@SO AS
NVARCHAR(100));
ROLLBACK TRANSACTION;
END
END
ELSE
BEGIN
PRINT N'KHÔNG THUỘC VỊ TRÍ NÀO';
ROLLBACK TRANSACTION;
END
END;
INSERT INTO CAUTHU VALUES (N'Nguyễn Công Sơn',N'Tiền đạo','1990-02-
20',NULL,'BBD','VN',10);

---------------------------------------- FOR UPDATE


---------------------------------------------

/* 7. Không cho sửa kết quả của các trận đã diễn ra. */
--Bản chất của UPDATE một dữ liệu là DELETE đi dữ liệu cũ và INSERT một dữ liệu mới

DROP TRIGGER TRIG_TRANDAU;


CREATE TRIGGER TRIG_TRANDAU ON TRANDAU
FOR UPDATE
AS
BEGIN
DECLARE @KETQUA1 VARCHAR(5)
DECLARE @KETQUA2 VARCHAR(5)
Select @KETQUA1 = I.KETQUA, @KETQUA2 = d.KETQUA from INSERTED i join DELETED
d on (i.MATRAN = d.MATRAN);
IF (@KETQUA1 <> @KETQUA2)
BEGIN
PRINT N'KHÔNG ĐƯỢC CHỈNH SỬA KẾT QUẢ CỦA TRẬN ĐẤU';
ROLLBACK TRANSACTION;
END
END;

UPDATE TRANDAU SET KETQUA='3-1' WHERE MATRAN=1;

-------------------------------COMMIT - ROLLBACK
-----------------------------------------------------
/* 9. Khi thêm mới một câu lạc bộ thì kiểm tra xem đã có câu lạc bộ trùng tên
với câu lạc bộ vừa được thêm hay không?
A. chỉ thông báo vẫn cho insert.
B. thông báo và không cho insert */

--A. chỉ thông báo vẫn cho insert.

CREATE TRIGGER TRIG_CAULACBO ON CAULACBO


FOR INSERT
AS
DECLARE @MACLB VARCHAR(5);
DECLARE @TENCLB NVARCHAR(100);
DECLARE @MASAN VARCHAR(5);
DECLARE @MATINH VARCHAR(5);
BEGIN
SELECT @TENCLB = A.TENCLB FROM INSERTED A;
BEGIN
IF((SELECT COUNT(*) FROM CAULACBO A WHERE A.TENCLB=@TENCLB) > 0)
PRINT N'TRÙNG TÊN CÂU LẠC BỘ VÀ TẠO BẢN GHI MỚI';
END
INSERT INTO CAULACBO VALUES (@MACLB, @TENCLB, @MASAN, @MATINH);
COMMIT TRANSACTION;
END

--B. thông báo và không cho insert

CREATE TRIGGER TRIG_CAULACBO2 ON CAULACBO


FOR INSERT
AS
DECLARE @MACLB VARCHAR(5);
DECLARE @TENCLB NVARCHAR(100);
DECLARE @MASAN VARCHAR(5);
DECLARE @MATINH VARCHAR(5);
BEGIN
SELECT @TENCLB = A.TENCLB FROM INSERTED A;
IF((SELECT COUNT(*) FROM CAULACBO A WHERE A.TENCLB=@TENCLB) = 0)
BEGIN
INSERT INTO CAULACBO VALUES (@MACLB, @TENCLB, @MASAN, @MATINH);
DECLARE @error INT;
SELECT @error = @@ERROR;
IF @error = 0
BEGIN
COMMIT TRANSACTION;
PRINT N'Đã tạo bản ghi';
END
ELSE
BEGIN
PRINT N'Xảy ra lỗi khi tạo mới';
ROLLBACK TRANSACTION;
END
END
ELSE
PRINT N'TRÙNG TÊN CÂU LẠC BỘ, ROLLBACK TRANSACTION';
END

You might also like