Database 在SQL Server 2014中生成触发器,详细信息如下:

Database 在SQL Server 2014中生成触发器,详细信息如下:,database,triggers,sql-server-2014,Database,Triggers,Sql Server 2014,编写一个触发器,该触发器不会在发布表中插入无效的no_of_章节。一本书所有作者的章节数不得小于或等于一本书的总章节数 我的尝试: 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 DE

编写一个触发器,该触发器不会在发布表中插入无效的no_of_章节。一本书所有作者的章节数不得小于或等于一本书的总章节数

我的尝试:

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的值,以及当用户尝试在表中插入时如何给出该值

数据库作者表:

数据库图书表:

在Author and Book表中插入的数据:

数据库发布表:


发布表中的aid和bid都是外键。

您的触发器有几个基本缺陷:

您从不引用插入的伪表-因此,每次在出版物中插入内容时,您都要处理整个Author和Book表-它们不会停留在每一行!插入引用以仅获取实际插入到发布中的行

您的选择似乎表明您假设每插入一行触发一次触发器,而SQL Server中并非如此。插入的伪表可以也将可以!包含多行-您需要以基于集合的方式正确处理这些行

在这里,我根本看不出作者是如何相关的——这只是关于不插入一本书允许的更多章节的出版物

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

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

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

我怀疑您的tables Book和作者只有一行。另外,为什么不在此处引用插入的对象?您甚至不引用触发器所在的表。另外:作者表、书籍表和出版物表的结构是什么,它们之间的关系是什么?@marc_s我更新了问题,您现在可以检查它们之间的关系了。@Larnu是的,两个表中只有一行,如何引用插入的对象?