实验题基于学生选课数据库,其包含三个关系模式:
(1)学生关系模式Student(Sno, Sname, Ssex, Sage,Sdept)
(2)课程关系模式Course(Cno, Cname, Cpno, Ccredit)
(3)选课关系模式SC(Sno, Cno, Grade)其中,
学生关系模式各字段的含义为Sno:学号,Sname:姓名,Ssex:性别,Sage:年龄,Sdept:所在系。
课程关系模式各字段的定义为Cno:课程号,Cname:课程名,Cpno:先行课,Ccredit:学分。
选课关系模式各字段的定义为Sno:学号,Cno:课程号,Grade:成绩。
其中,SC表中学号Sno和课程号Cno分别对应于Student表的主码和Course表的主码,即学号Sno和课程号Cno是SC表的外码。
- 对于学生表:STU(SNO CHAR(10),SNAME CHAR(10),SAGE INT) 和日志表LOGS(TIME DATETIME,SNO CHAR(10))设置一个触发器,使得在STU表中插入信息时,日志表LOGS中插入当前时间与学生学号(SNO);
CREATE TRIGGER INSTU
AFTER INSERT ON STU
FOR EACH ROW AS
BEGIN
INSERT INTO LOGS
VALUES(CURRENT_DATE,new.SNO);
END;
- 对学生表STU(SNO,SNAME,SSEX,SAGE),设置一个触发器,使得当插入新信息时,如果性别SSEX不是’FEMALE’或’MALE’,则将性别置为空;
CREATETRIGGER INSTU
AFTERINSERT ON STU
FOR EACHROW AS
BEGIN
IF(new.SSEX<>'FEMALE') AND (new.SSEX<>'MALE')
THEN UPDATE STU
SET SSEX=NULL
WHERE SNO=new.SNO;
END IF;
END;
- 对于学生表:STU(SNO,SNAME,SSEX,SAGE,SDEPT)
设置一个触发器,使得在对STU表进行SAGE更新的时候,只能升不能降,如果SAGE比原来低则SAGE保持不变;
CREATE TRIGGER UPSTU
AFTER UPDATE OF SAGE ON STU
FOR EACH ROW AS
BEGIN
IF(new.SAGE<old.SAGE)
THEN UPDATE STU
SET SAGE=old.SAGE
WHERE SNO=new.SNO;
END IF;
END;
- 对于学生表:STU(SNO,SNAME,SGRADE)
,设置一个触发器,使得每次在学生表STU中插入信息时,年级SGRADE均为2018;
CREATE TRIGGER INSTU
AFTER INSERT ON STU
FOR EACH ROW AS
BEGIN
UPDATE STU
SET SGRADE=2018
WHERE SNO=new.SNO;
END;
- 对于课程表COU(CNO,CNAME,CPNO,CCREDIT)与日志表LOGS(TIME DATETIME,CNO CHAR(10)),设置一个触发器,使得当COU表插入信息时,日志表LOGS中插入当前时间与课程号(CNO);
CREATE TRIGGER INCOU
AFTER INSERT ON COU
FOR EACH ROW AS
BEGIN
INSERT INTO LOGS
VALUES(CURRENT_DATE,new.CNO);
END;
- 对于学生表STU(SNO,SNAME,SSEX,SAGE),设置一个触发器,使得当插入新信息时,如果年龄SAGE大于22,则将年龄设为22;
CREATE TRIGGER INSTU
AFTER INSERT ON STU
FOR EACH ROW AS
BEGIN
IF(new.SAGE>22)
THE UPDATE STU
SET SAGE=22
WHERE SNO=new.SNO;
END IF;
END;
- 对于学生选课表COU(SNO,CNO,GRADE)与日志表LOGS(TIME DATETIME,SNO CHAR(10),CNO CHAR(10),OLDGRADE INT),设置一个触发器,使得当成绩信息GRADE改变时,在日志表LOGS中记录以前的成绩;
CREATE TRIGGER UPCOU
AFTER UPDATE ON COU
FOR EACH ROW AS
BEGIN
IF(new.GRADE<>old.GRADE)
THEN INSERT INTO LOGS
VALUES(CURRENT_DATE,new.SNO,new.CNO,old.GRADE);
END IF;
END;