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 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 ngày khách hàng đó đăng đ ăng k{ thành viên (NGDK). CREATE TRIGGER UPDATE_KH_C11 ON KHACHHANG FOR UPDATE AS DECLARE @NGDK SMALLDATETIME SMALLDATETIME, , @NGHD SMALLDATETIME SELECT FROM
@NGDK= @NGDK=NGDK INSERTED
IF( IF (@NGDK>ANY( @NGDK>ANY(SELECT SELECT NGHD FROM HOADON A, A, INSERTED I WHERE A.MAKH= MAKH=I.MAKH)) MAKH)) BEGIN ROLLBACK TRAN PRINT 'ERROR!NGDK PHAI NHO HON NGHD' END ELSE PRINT' PRINT ' SUCCESSFUL' ------CREATE TRIGGER HD_C11 ON HOADON FOR INSERT INSERT, ,UPDATE AS DECLARE @NGDK SMALLDATETIME SMALLDATETIME, , @NGHD SMALLDATETIME SELECT @NGDK= @NGDK=NGDK, NGDK,@NGHD= @NGHD=NGHD FROM INSERTED I, I, KHACHHANG A WHERE I.MAKH= MAKH=A.MAKH IF @NGHD< @NGHD<@NGDK BEGIN ROLLBACK TRAN PRINT 'ERROR!NGHD PHAI LON HON NGDK' END ELSE PRINT' 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 FROM
@NGVL=NGVL 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 ết hóa đơn. CREATE TRIGGER CTHD_C13 ON CTHD FOR DELETE,UPDATE AS DECLARE @SL @SOHD INT SELECT
INT,
@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 FROM
@SOHD=SOHD 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 ền (số lượng*đơn giá) của các chi ế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 @SOHD INT
MONEY,
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 FROM SELECT FROM
@GIA_CU=GIA DELETED @GIA_MOI=GIA 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 FROM
@MAKH=MAKH 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 FROM
@DOANHSO_CU=DOANHSO 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 FROM
@MAKH=MAKH,@TRIGIA=TRIGIA 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 FROM
@MAKH=MAKH,@TRIGIA=TRIGIA 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 FROM
@MAKH=MAKH,@TRIGIA_MOI=TRIGIA INSERTED
SELECT FROM
@MAKH=MAKH,@TRIGIA_CU=TRIGIA 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 @MALOP2
char(3), 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 FROM
@DENNGAY=DENNGAY INSERTED
IF(@DENNGAY
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 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 FROM
@MAMH=MAMH, @MAMH_TRUOC=MAMH_TRUOC 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 ON FOR AS
TRIGGER INSERT_UPDATE_KETQUATHI_C20 KETQUATHI INSERT, UPDATE DECLARE
@LANTHI INT, @DIEM NUMERIC(4,2)
SELECT FROM
@LANTHI=LANTHI 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'