From ea0131ce37f2e5f49e4721cc173a817564135d6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=A1=E5=9D=82=E6=98=B4?= Date: Tue, 19 Nov 2024 22:49:45 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E9=AA=8C=E5=8D=81=E4=B8=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.MD | 2 + 实验三.sql | 2 +- 实验十三.sql | 112 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 实验十三.sql diff --git a/README.MD b/README.MD index 1947c43..40f9a53 100644 --- a/README.MD +++ b/README.MD @@ -34,6 +34,8 @@ - [实验十二](实验十二.sql) +- [实验十三](实验十三.sql) + ### 课后作业📖 [课后作业](课后作业/) diff --git a/实验三.sql b/实验三.sql index b5eb60a..fa14cdb 100644 --- a/实验三.sql +++ b/实验三.sql @@ -42,7 +42,7 @@ CREATE TABLE 课程表 课程性质 VARCHAR(10) CHECK(课程性质 IN('公共基础','专业基础','专业选修','任意选修')), FOREIGN KEY(责任教师) REFERENCES 教师表(教师编号) ); ---(5) 选课表 +-- (5) 选课表 CREATE TABLE 选课表( 学号 VARCHAR(8), 课程编号 VARCHAR(8), diff --git a/实验十三.sql b/实验十三.sql new file mode 100644 index 0000000..2c594ca --- /dev/null +++ b/实验十三.sql @@ -0,0 +1,112 @@ +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;