实验题基于学生选课数据库,其包含三个关系模式: (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;