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;
