You are on page 1of 12

Phần 3:Trigger in SQL

GS:Tống Hoàng Anh Kiên


I:Quản l{ hàng hóa
Câu 11:Ngày mua hàng (NGHD) của một khách hàng thành viên
sẽ lớn hơn hoặc bằng ngày khách hàng đó đăng k{ thành viên
(NGDK).
CREATE TRIGGER UPDATE_KH_C11
ON KHACHHANG
FOR UPDATE
AS
DECLARE @NGDK SMALLDATETIME,
@NGHD SMALLDATETIME

SELECT @NGDK=NGDK
FROM INSERTED

IF(@NGDK>ANY(SELECT NGHD
FROM HOADON A, INSERTED I
WHERE A.MAKH=I.MAKH))
BEGIN
ROLLBACK TRAN
PRINT 'ERROR!NGDK PHAI NHO HON NGHD'
END
ELSE
PRINT' SUCCESSFUL'
-------
CREATE TRIGGER HD_C11
ON HOADON
FOR INSERT,UPDATE
AS
DECLARE @NGDK SMALLDATETIME,
@NGHD SMALLDATETIME

SELECT @NGDK=NGDK,@NGHD=NGHD
FROM INSERTED I, KHACHHANG A
WHERE I.MAKH=A.MAKH

IF @NGHD<@NGDK
BEGIN
ROLLBACK TRAN
PRINT 'ERROR!NGHD PHAI LON HON NGDK'
END
ELSE
PRINT' SUCCESSFUL'
Câu 12: Ngày bán hàng (NGHD) của một nhân viên phải
lớn hơn hoặc bằng ngày nhân viên đó vào làm
CREATE TRIGGER UPDATE_NV_C12
ON NHANVIEN
FOR UPDATE
AS
DECLARE @NGVL SMALLDATETIME,
@NGHD SMALLDATETIME

SELECT @NGVL=NGVL
FROM INSERTED

IF(@NGVL>ANY(SELECT NGHD
FROM HOADON A, INSERTED I
WHERE A.MANV=I.MANV))
BEGIN
ROLLBACK TRAN
PRINT 'ERROR!NGVL PHAI NHO HON NGHD'
END
ELSE
PRINT' SUCCESSFUL'
-------
CREATE TRIGGER HD_C12
ON HOADON
FOR INSERT,UPDATE
AS
DECLARE @NGVL SMALLDATETIME,
@NGHD SMALLDATETIME

SELECT @NGVL=NGVL,@NGHD=NGHD
FROM INSERTED I, NHANVIEN A
WHERE I.MANV=A.MANV

IF @NGHD<@NGVL
BEGIN
ROLLBACK TRAN
PRINT 'ERROR!NGHD PHAI LON HON NGVL'
END
ELSE
PRINT' SUCCESSFUL'

Câu 13: Mỗi một hóa đơn phải có ít nhất một chi tiết hóa
đơn.
CREATE TRIGGER CTHD_C13
ON CTHD
FOR DELETE,UPDATE
AS
DECLARE @SL INT,
@SOHD INT

SELECT @SL=COUNT(A.SOHD),@SOHD=D.SOHD
FROM DELETED D,CTHD A
WHERE A.SOHD=D.SOHD
GROUP BY D.SOHD

IF(@SL<1)
BEGIN
DELETE FROM HOADON
WHERE SOHD=@SOHD
PRINT 'DA DELETE CTHD CUOI CUNG CUA HOADON TREN'
END
------
CREATE TRIGGER HOADON_C13
ON HOADON
FOR INSERT
AS
DECLARE @SOHD INT

SELECT @SOHD=SOHD
FROM INSERTED

UPDATE CTHD
SET MASP='NONE',SL=0
WHERE SOHD=@SOHD

PRINT 'SUCCESSFUL! DE NGHI UPDATE LAI CTHD(MAC DINH:MASP="NONE", SL=0)'

Câu 14: Trị giá của một hóa đơn là tổng thành tiền (số
lượng*đơn giá) của các chi tiết thuộc hóa đơn đó
CREATE TRIGGER INSERT_HOADON_C14
ON HOADON
FOR INSERT
AS
UPDATE HOADON
SET TRIGIA=0
WHERE SOHD=(SELECT SOHD
FROM INSERTED)
PRINT'DA INSERT 1 HOADON VOI TRIGIA BAN DAU LA 0 VND'
-------------
CREATE TRIGGER UPDATE_HOADON_C14
ON HOADON
FOR INSERT
AS
UPDATE HOADON
SET TRIGIA=(SELECT TRIGIA
FROM DELETED)
WHERE SOHD=(SELECT SOHD
FROM INSERTED)
PRINT'DA UPDATE 1 HOADON VOI TRIGIA KHONG THAY DOI'
-------------
CREATE TRIGGER INSERT_CTHD_C14
ON CTHD
FOR INSERT
AS
DECLARE @SL INT,
@GIA MONEY,
@SOHD INT

SELECT @GIA=GIA,@SL=SL,@SOHD=SOHD
FROM INSERTED A, SANPHAM B
WHERE A.MASP=B.MASP

UPDATE HOADON
SET TRIGIA=TRIGIA+@SL*@GIA
PRINT'DA INSERT 1 CTHD VA UPDATE LAI TRIGIA CUA HOADON TUONG UNG'
--------------
CREATE TRIGGER DELETE_CTHD_C14
ON CTHD
FOR DELETE
AS
DECLARE @SL INT,
@GIA MONEY,
@SOHD INT

SELECT @GIA=GIA,@SL=SL,@SOHD=SOHD
FROM DELETED A, SANPHAM B
WHERE A.MASP=B.MASP

UPDATE HOADON
SET TRIGIA=TRIGIA-@SL*@GIA
PRINT'DA DELETE 1 CTHD VA UPDATE LAI TRIGIA CUA HOADON TUONG UNG'
-------------------
CREATE TRIGGER UPDATE_CTHD_C14
ON CTHD
FOR UPDATE
AS
DECLARE @SL_CU INT,
@SL_MOI INT,
@GIA_CU MONEY,
@GIA_MOI MONEY,
@SOHD_CU INT,
@SOHD_MOI INT

SELECT @GIA_CU=GIA,@SL_CU=SL,@SOHD_CU=SOHD
FROM DELETED A, SANPHAM B
WHERE A.MASP=B.MASP

SELECT @GIA_MOI=GIA,@SL_MOI=SL,@SOHD_MOI=SOHD
FROM INSERTED A, SANPHAM B
WHERE A.MASP=B.MASP

IF(@SOHD_CU=@SOHD_MOI)
BEGIN
UPDATE HOADON
SET TRIGIA=TRIGIA+@SL_MOI*@GIA_MOI-@SL_CU*@GIA_CU
WHERE SOHD=@SOHD_CU
END
ELSE
BEGIN
UPDATE HOADON
SET TRIGIA=TRIGIA-@SL_CU*@GIA_CU
WHERE SOHD=@SOHD_CU
UPDATE HOADON
SET TRIGIA=TRIGIA+@SL_MOI*@GIA_MOI
WHERE SOHD=@SOHD_MOI
END
PRINT'DA UPDATE 1 CTHD VA UPDATE LAI TRIGIA CUA HOADON TUONG UNG'
-------------------
CREATE TRIGGER UPDATE_HOADON_C14
ON HOADON
FOR INSERT
AS
DECLARE @GIA_CU MONEY,
@GIA_MOI MONEY,
@SOHD INT,
@SL INT

SELECT @GIA_CU=GIA
FROM DELETED
SELECT @GIA_MOI=GIA
FROM INSERTED

SELECT @SOHD=SOHD,@SL=SL
FROM INSERTED A, CTHD B
WHERE A.MASP=B.MASP

UPDATE HOADON
SET TRIGIA=TRIGIA+@SL*(@GIA_MOI-@GIA_CU)
WHERE SOHD=@SOHD
PRINT'DA UPDATE 1 HOADON VOI TRIGIA KHONG THAY DOI'

Câu 15: Doanh số của một khách hàng là tổng trị giá các
hóa đơn mà khách hàng thành viên đó đã mua.
CREATE TRIGGER INSERT_KHACHHANG_C15
ON KHACHHANG
FOR INSERT
AS
DECLARE @MAKH CHAR(4)

SELECT @MAKH=MAKH
FROM INSERTED

UPDATE KHACHHANG
SET DOANHSO=0
WHERE MAKH=@MAKH

PRINT 'DA INSERT 1 KHACHHANG MOI VOI DOANHSO BAN DAU LA 0 VND'
----------------
CREATE TRIGGER UPDATE_KHACHHANG_C15
ON KHACHHANG
FOR UPDATE
AS
DECLARE @MAKH CHAR(4),
@DOANHSO_CU MONEY

SELECT @MAKH=MAKH
FROM INSERTED

SELECT @DOANHSO_CU=DOANHSO
FROM DELETED

UPDATE KHACHHANG
SET DOANHSO=@DOANHSO_CU
WHERE MAKH=@MAKH

PRINT 'DA UPDATE 1 KHACHHANG'


----------------
CREATE TRIGGER INSERT_HOADON_C15
ON HOADON
FOR INSERT
AS
DECLARE @TRIGIA MONEY,
@MAKH CHAR(4)

SELECT @MAKH=MAKH,@TRIGIA=TRIGIA
FROM INSERTED

UPDATE KHACHHANG
SET DOANHSO=DOANHSO+@TRIGIA
WHERE MAKH=@MAKH

PRINT 'DA INSERT 1 HODON MOI VA UPDATE LAI DOANHSO CUA KH CO SOHD TREN'

-----------
CREATE TRIGGER DELETE_HOADON_C15
ON HOADON
FOR DELETE
AS
DECLARE @TRIGIA MONEY,
@MAKH CHAR(4)

SELECT @MAKH=MAKH,@TRIGIA=TRIGIA
FROM DELETED

UPDATE KHACHHANG
SET DOANHSO=DOANHSO-@TRIGIA
WHERE MAKH=@MAKH

PRINT 'DA DELETE 1 HODON MOI VA UPDATE LAI DOANHSO CUA KH CO SOHD TREN'
---------------
CREATE TRIGGER UPDATE_HOADON_C15
ON HOADON
FOR UPDATE
AS
DECLARE @TRIGIA_CU MONEY,
@TRIGIA_MOI MONEY,
@MAKH CHAR(4)

SELECT @MAKH=MAKH,@TRIGIA_MOI=TRIGIA
FROM INSERTED

SELECT @MAKH=MAKH,@TRIGIA_CU=TRIGIA
FROM DELETED
UPDATE KHACHHANG
SET DOANHSO=DOANHSO+@TRIGIA_MOI-@TRIGIA_CU
WHERE MAKH=@MAKH

PRINT 'DA UPDATE 1 HOADON MOI VA UPDATE LAI DOANHSO CUA KH CO SOHD
TREN'

II:Quản l{ giáo vụ
Câu 9: Lớp trưởng của một lớp phải là học viên của lớp
đó
CREATE TRIGGER UPDATE_LOP_C9
ON LOP
FOR UPDATE
AS
DECLARE @MALOP1 char(3),
@MALOP2 char(3)

SELECT @MALOP1=A.MALOP,@MALOP2=B.MALOP
FROM INSERTED A, HOCVIEN B
WHERE A.TRGLOP=B.MAHV

IF(@MALOP1<>@MALOP2)
BEGIN
ROLLBACK TRAN
PRINT'TRGLOP CUA 1 LOP PHAI LA HOCVIEN CUA LOP DO'
END
ELSE
PRINT 'SUCCESSFUL'

Câu 10: Trưởng khoa phải là giáo viên thuộc khoa và có


học vị “TS” hoặc “PTS”.
CREATE TRIGGER UPDATE_KHOA_C10
ON KHOA
FOR UPDATE
AS
DECLARE @MAKHOA1 varchar(4),
@MAKHOA2 varchar(4),
@HOCVI varchar(10)

SELECT @MAKHOA1=A.MAKHOA,@MAKHOA2=B.MAKHOA,@HOCVI=HOCVI
FROM INSERTED A,GIAOVIEN B
WHERE A.TRGKHOA=B.MAGV

IF(@MAKHOA1<>@MAKHOA2)
BEGIN
ROLLBACK TRAN
PRINT'ERROR! TRGKHOA PHAI LA GIAOVIEN THUOC KHOA'
END
ELSE
IF(@HOCVI<>'TS' AND @HOCVI<>'PTS')
BEGIN
ROLLBACK TRAN
PRINT 'ERROR! TRGKHOA PHAI CO HOCVI="TS" HOAC
HOCVI="PTS"'
END
ELSE
PRINT 'SUCCESSFUL'
-----------
CREATE TRIGGER UPDATE_GIAOVIEN_C10
ON GIAOVIEN
FOR UPDATE
AS
DECLARE @MAKHOA1 varchar(4),
@MAKHOA2 varchar(4),
@HOCVI varchar(10)

SELECT @MAKHOA1=A.MAKHOA,@MAKHOA2=B.MAKHOA,@HOCVI=HOCVI
FROM INSERTED A,KHOA B
WHERE B.TRGKHOA=A.MAGV

IF(@MAKHOA1<>@MAKHOA2)
BEGIN
ROLLBACK TRAN
PRINT'ERROR! TRGKHOA PHAI LA GIAOVIEN THUOC KHOA'
END
ELSE
IF(@HOCVI<>'TS' AND @HOCVI<>'PTS')
BEGIN
ROLLBACK TRAN
PRINT 'ERROR! TRGKHOA PHAI CO HOCVI="TS" HOAC
HOCVI="PTS"'
END
ELSE
PRINT 'SUCCESSFUL'

Câu 15: Học viên chỉ được thi một môn học nào đó khi
lớp của học viên đã học xong môn học này
ALTER TRIGGER INSERT_YPDATE_KETQUATHI_C15
ON KETQUATHI
FOR INSERT, UPDATE
AS
DECLARE @NGTHI SMALLDATETIME,
@DENNGAY SMALLDATETIME

SELECT @NGTHI=NGTHI,@DENNGAY=DENNGAY
FROM INSERTED A,HOCVIEN B, GIANGDAY C
WHERE A.MAHV=B.MAHV AND B.MALOP=C.MALOP AND A.MAMH=C.MAMH

IF(@NGTHI>@DENNGAY)
PRINT 'SUCCESSFUL!KETQUATHI HOP LE.'
ELSE
BEGIN
ROLLBACK TRAN
PRINT 'ERROR!LOP CUA HV CHUA HOC XONG MON NAY'
END
--------
ALTER TRIGGER UPDATE_GIANGDAY_C15
ON GIANGDAY
FOR UPDATE
AS
DECLARE @NGTHI SMALLDATETIME,
@DENNGAY SMALLDATETIME

SELECT @DENNGAY=DENNGAY
FROM INSERTED

IF(@DENNGAY<ALL (SELECT NGTHI


FROM INSERTED A,HOCVIEN B, KETQUATHI C
WHERE A.MALOP=B.MALOP AND B.MAHV=C.MAHV AND
A.MAMH=C.MAMH))
PRINT 'SUCCESSFUL!THOA YEU CAU DENNGAY<NGTHI'
ELSE
BEGIN
ROLLBACK TRAN
PRINT 'ERROR!ANH HUONG DEN KETQUATHI, NGAY_KET_THUC PHAI
TRUOC HON NGAYTHI.'
END

Câu 16: Mỗi học kz của một năm học, một lớp chỉ được
học tối đa 3 môn
CREATE TRIGGER INSERT_UPDATE_GIANGDAY_C16
ON GIANGDAY
FOR INSERT, UPDATE
AS
DECLARE @SL_MONHOC INT

SELECT @SL_MONHOC=COUNT(A.MAMH)
FROM GIANGDAY A, INSERTED B
WHERE A.MALOP=B.MALOP AND A.HOCKY=B.HOCKY AND A.NAM=B.NAM

IF(@SL_MONHOC=4)
BEGIN
ROLLBACK TRAN
PRINT 'ERROR!LOP NAY DA HOC HON 3 MON TRONG CUNG HOCKY,
NAM'
END

Câu 17: Sỉ số của một lớp bằng với số lượng học viên
thuộc lớp đó
CREATE TRIGGER INSERT_LOP_C17
ON LOP
FOR INSERT
AS
UPDATE LOP
SET SISO=0
WHERE MALOP=(SELECT MALOP
FROM INSERTED)
----------
DROP TRIGGER UPDATE_LOP_C17
ON LOP
FOR UPDATE
AS
UPDATE LOP
SET SISO=(SELECT SISO
FROM DELETED)
WHERE MALOP=(SELECT MALOP
FROM INSERTED)
--------------
CREATE TRIGGER INSERT_HOCVIEN_C17
ON HOCVIEN
FOR INSERT
AS
UPDATE LOP
SET SISO=SISO+1
WHERE MALOP=(SELECT MALOP
FROM INSERTED)
------------
ALTER TRIGGER DELETE_HOCVIEN_C17
ON HOCVIEN
FOR DELETE
AS
DECLARE @MAHV CHAR(5),
@TRGLOP CHAR(5),
@MALOP CHAR(3)

SELECT @MAHV=MAHV, @TRGLOP=TRGLOP, @MALOP=A.MALOP


FROM DELETED A, LOP B
WHERE A.MALOP=B.MALOP

UPDATE LOP
SET SISO=SISO-1
WHERE MALOP=@MALOP
-------------
CREATE TRIGGER UPDATE_HOCVIEN_C17
ON HOCVIEN
FOR UPDATE
AS
UPDATE LOP
SET SISO=SISO+1
WHERE MALOP=(SELECT MALOP
FROM INSERTED)
UPDATE LOP
SET SISO=SISO-1
WHERE MALOP=(SELECT MALOP
FROM DELETED)

Câu 18: Trong quan hệ DIEUKIEN giá trị của thuộc tính
MAMH và MAMH_TRUOC trong cùng một bộ không
được giống nhau (“A”,”A”) và cũng không tồn tại hai bộ
(“A”,”B”) và (“B”,”A”).
CREATE TRIGGER INSERT_UPDATE_C18
ON DIEUKIEN
FOR INSERT, UPDATE
AS
DECLARE @MAMH VARCHAR(10),
@MAMH_TRUOC VARCHAR(10)

SELECT @MAMH=MAMH, @MAMH_TRUOC=MAMH_TRUOC


FROM INSERTED

IF((@MAMH=@MAMH_TRUOC)OR
(@MAMH IN (SELECT MAMH_TRUOC
FROM DIEUKIEN
WHERE MAMH=@MAMH_TRUOC))OR
(@MAMH_TRUOC IN (SELECT MAMH
FROM DIEUKIEN
WHERE MAMH_TRUOC=@MAMH)))
BEGIN
ROLLBACK TRAN
PRINT 'DIEUKIEN KO HOP LE'
END

Câu 19: Các giáo viên có cùng học vị, học hàm, hệ số
lương thì mức lương bằng nhau
ALTER TRIGGER INSERT_UPDATE_GIAOVIEN_C19
ON GIAOVIEN
FOR INSERT, UPDATE
AS
DECLARE @MUCLUONG MONEY,
@MAGV CHAR(4)

SELECT DISTINCT @MUCLUONG=A.MUCLUONG,@MAGV=B.MAGV


FROM GIAOVIEN A, INSERTED B
WHERE A.HOCHAM=B.HOCHAM AND A.HOCVI=B.HOCVI AND A.HESO=B.HESO AND
A.MAGV<>B.MAGV

UPDATE GIAOVIEN
SET MUCLUONG=@MUCLUONG
WHERE MAGV=@MAGV

Câu 20: Học viên chỉ được thi lại (lần thi >1) khi điểm của
lần thi trước đó dưới 5
CREATE TRIGGER INSERT_UPDATE_KETQUATHI_C20
ON KETQUATHI
FOR INSERT, UPDATE
AS
DECLARE @LANTHI INT,
@DIEM NUMERIC(4,2)
SELECT @LANTHI=LANTHI
FROM INSERTED

IF(@LANTHI>1)
BEGIN
SELECT @DIEM=B.DIEM
FROM INSERTED A,KETQUATHI B
WHERE A.MAHV=B.MAHV AND A.MAMH=B.MAMH AND B.LANTHI=@LANTHI-1

IF(@DIEM>=5)
BEGIN
ROLLBACK TRAN
PRINT 'HV NAY DA THI DAT'
END
END
DELETE FROM KETQUATHI
WHERE LANTHI>@LANTHI

Câu 24: Giáo viên chỉ được phân công dạy những môn
thuộc khoa giáo viên đó phụ trách.
DROP TRIGGER INSERT_GIANGDAY_C24
ON GIANGDAY
FOR INSERT, UPDATE
AS
DECLARE @MAKHOA1 CHAR(4),
@MAKHOA2 CHAR(4)

SELECT @MAKHOA1=B.MAKHOA, @MAKHOA2=C.MAKHOA


FROM INSERTED A, MONHOC B, GIAOVIEN C
WHERE A.MAMH=B.MAMH AND A.MAGV=C.MAGV

IF(@MAKHOA1<>@MAKHOA2)
BEGIN
ROLLBACK TRAN
PRINT 'ERROR!MAMH PHAI THUOC KHOA GIAO VIEN PHU TRACH'
END
ELSE
PRINT 'SUCCESSFUL'

You might also like