在 SQL Server 2014 中制作触发器,详情如下:

Making trigger in SQL Server 2014 with details given below:

编写一个触发器,不在 Publication table 中插入无效的 no_of_chapters。某本书的所有作者的 No_of_chapters 必须小于或等于一本书的 total_chapters

我的尝试:

ALTER TRIGGER INS_STOP 
ON Publication 
AFTER INSERT
AS
BEGIN
    DECLARE @AID INT =(SELECT aid from Author)
    DECLARE @BID INT =(SELECT bid from Book) 
    DECLARE @N_O_C INT
    DECLARE @T_C INT =(Select total_chapters from Book)
    if(@N_O_C <= @T_C)
    BEGIN
         PRINT 'Invalid Number of Chapters' 
    END
END

现在这个问题的原因是如何在触发器中检查 No_of_chapters 的值以及当用户尝试在 table 中插入时如何给出它。

数据库(Author table):

数据库(Book table):

已在 AuthorBook 中插入数据 Table:

数据库(Publication table):

aidbidPublicationTable中都是外键。

你的触发器有几个根本性的缺陷:

  • 您从不引用 Inserted 伪 table - 因此,每次将某些内容插入 Publication 时,您都会处理整个 AuthorBook tables - 他们不会每人只呆在一排!引用 Inserted 以仅获取那些 实际上 插入到 Publication !

    中的行
  • 您的选择似乎表明您假设每插入一行都会触发一次触发器 - 在 SQL 服务器中并非如此 . Inserted 伪 table 可以(并且 将!)包含多行 - 您需要以基于集合的方式正确处理这些行

现在,我完全看不出 Author 有何相关性 - 它只是关于不插入章节数超过本书所允许的出版物。

您需要像这样编写触发器:

ALTER TRIGGER INS_STOP 
ON Publication 
AFTER INSERT
AS
BEGIN
    -- check to see if any of the publications in the "Inserted" 
    -- pseudo table has more chapters than the reference "Book" allows
    IF EXISTS (SELECT * 
               FROM Inserted i
               INNER JOIN dbo.Book b ON i.bid = b.bid
               WHERE i.no_chapters > b.total_chapters)
    BEGIN
        THROW 71007, 'At least one publication contains more chapters than allowed by the book', 1;  
    END;
END

查看T-SQL关于THROW命令的官方文档-您可以根据需要定义错误号(此处:71007)、消息和状态(此处:1)-有关详细信息,请参阅官方文档。