USE 学生管理; -- (1)为选课表分别建立插入和更新触发器,如果当前学生累计不及格门数达到5则给出警示信息。 -- 插入触发器 CREATE TRIGGER 插入警示 ON 选课表 AFTER INSERT AS BEGIN SET NOCOUNT ON; CREATE TABLE #警示信息 ( 学号 VARCHAR(8), 不及格门数 INT ); INSERT INTO #警示信息(学号, 不及格门数) SELECT i.学号, COUNT(*) AS 不及格门数 FROM 选课表 AS q INNER JOIN INSERTED AS i ON q.学号 = i.学号 WHERE q.成绩 < 60 GROUP BY i.学号 HAVING COUNT(*) >= 5; IF EXISTS (SELECT 1 FROM #警示信息) BEGIN DECLARE @警示文本 NVARCHAR(MAX); SELECT @警示文本 = STRING_AGG( CONCAT('警示: 学号 ', 学号, ' 的累计不及格门数已达到 ', 不及格门数, ' 门!'), CHAR(13) + CHAR(10) ) FROM #警示信息; RAISERROR (@警示文本, 16, 1); ROLLBACK TRANSACTION; END DROP TABLE #警示信息; END; -- 更新触发器 CREATE TRIGGER 更新警示 ON 选课表 AFTER UPDATE AS BEGIN SET NOCOUNT ON; CREATE TABLE #警示信息 ( 学号 VARCHAR(8), 不及格门数 INT ); INSERT INTO #警示信息(学号, 不及格门数) SELECT i.学号, COUNT(*) AS 不及格门数 FROM 选课表 AS q INNER JOIN INSERTED AS i ON q.学号 = i.学号 WHERE q.成绩 < 60 GROUP BY i.学号 HAVING COUNT(*) >= 5; IF EXISTS (SELECT 1 FROM #警示信息) BEGIN DECLARE @警示文本 NVARCHAR(MAX); SELECT @警示文本 = STRING_AGG( CONCAT('警示: 学号 ', 学号, ' 的累计不及格门数已达到 ', 不及格门数, ' 门!'), CHAR(13) + CHAR(10) ) FROM #警示信息; RAISERROR (@警示文本, 16, 1); ROLLBACK TRANSACTION; END DROP TABLE #警示信息; END; -- (2)为课程表分别建立插入和更新触发器来建立约束规则:“专业基础”课的教师必须为“教授”或“副教授”,如果不满足约束则拒绝操作,并给出错误信息。 -- 插入触发器 CREATE TRIGGER 教师职称警告_插入 ON 课程表 AFTER INSERT AS BEGIN IF EXISTS ( SELECT * FROM INSERTED JOIN 教师表 ON INSERTED.责任教师=教师表.教师编号 WHERE (教师表.职称 != '教授' AND 教师表.职称 != '副教授')AND INSERTED.课程性质='专业基础' ) BEGIN RAISERROR ('教授专业基础课的教师必须为教授或副教授',16,1); ROLLBACK TRANSACTION; END; END; -- 更新触发器 CREATE TRIGGER 教师职称警告_更新 ON 课程表 AFTER UPDATE AS BEGIN IF EXISTS ( SELECT * FROM INSERTED JOIN 教师表 ON INSERTED.责任教师=教师表.教师编号 WHERE (教师表.职称 != '教授' AND 教师表.职称 != '副教授')AND INSERTED.课程性质='专业基础' ) BEGIN RAISERROR ('教授专业基础课的教师必须为教授或副教授',16,1); ROLLBACK TRANSACTION; END; END;