【问题标题】:SQL SERVER - Trigger to restrict over 3 recordsSQL SERVER - 触发器限制超过 3 条记录
【发布时间】:2020-04-17 12:06:33
【问题描述】:

我是 SQL 初学者,需要帮助设置触发器

我需要设置一个触发器,这样如果 1 位导师有超过 3 个不同的日程 ID,这是不允许的!

表格

TutorID/ScheduleID/Student
1       1           Tom 
1       1           Harry   
1       1           Lima    
1       2           Zany    
1       2           Logan   
1       3           Zoe
1       3           Lana

导师 ID/导师姓名 1山姆

如何限制某人插入另一个类?

【问题讨论】:

    标签: sql sql-server triggers sql-insert restrict


    【解决方案1】:

    免责声明:说实话,我不相信通过 SQL 触发器执行此操作是最好的解决方案,通过业务层控制此类事情要好得多。

    也就是说你可以使用触发器来阻止插入:

    CREATE TRIGGER MyTrigger ON dbo.ClassTable
    AFTER INSERT
    AS
    
    IF EXISTS (SELECT TutorId, COUNT(ScheduleId) 
               FROM db.ClassTable
               GROUP BY TutorID
               HAVING COUNT(ScheduleId) > 3)
    BEGIN
        ROLLBACK
        RAISERROR ('Too many classes scheduled!', 16, 1);
    END
    GO
    

    或者,如果您愿意,您可以执行 INSTEAD OF 触发器,然后默默地丢弃讨厌的额外行 :)

    CREATE OR ALTER TRIGGER MyTrigger ON dbo.ClassTable
    INSTEAD OF INSERT
     AS
        BEGIN
        SET NOCOUNT ON;
        INSERT dbo.ClassTable(TutorId, ScheduleId, Student)
            SELECT TutorId, ScheduleId, Student
            FROM inserted
            WHERE TutorId IN (SELECT TutorId, COUNT(ScheduleId) FROM db.ClassTable WHERE COUNT(ScheduleId) < 3 GROUP BY TutorID);
        END
    GO
    

    【讨论】:

    • 我认为您的“代替插入”触发器假定只插入了 1 条记录。如果为导师插入了 2 条记录,而 2 条已经存在怎么办?另外我认为您在 where 子句中的计数检查需要更改为 &lt;=3
    • &lt;=3 将允许包含第四条记录,尽管多记录插入会有问题
    • RAISERROR 中的数字(注意它只有一个'E')是严重性和状态值,请参阅here
    • @gstar 我已经修复了触发器的语法错误 - 抱歉,当我写它时我睡着了,是的,测试它的方法是尝试为第四节课做一个 INSERT ,此时它应该无法插入行并给你错误
    • @gstar 请注意,这只会阻止第 4 类被插入 - 如果有人在现有行上执行 UPDATE,您仍然可以超过限制,除非您在更新相同的条件。
    猜你喜欢
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-21
    相关资源
    最近更新 更多