Database 在SQL Server 2014中生成触发器,详细信息如下:
编写一个触发器,该触发器不会在发布表中插入无效的no_of_章节。一本书所有作者的章节数不得小于或等于一本书的总章节数 我的尝试: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
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是的,两个表中只有一行,如何引用插入的对象?