在 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):
已在 Author
和 Book
中插入数据 Table:
数据库(Publication
table):
aid
和bid
在Publication
Table中都是外键。
你的触发器有几个根本性的缺陷:
您从不引用 Inserted
伪 table - 因此,每次将某些内容插入 Publication
时,您都会处理整个 Author
和Book
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)-有关详细信息,请参阅官方文档。
编写一个触发器,不在 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):
已在 Author
和 Book
中插入数据 Table:
数据库(Publication
table):
aid
和bid
在Publication
Table中都是外键。
你的触发器有几个根本性的缺陷:
您从不引用
中的行Inserted
伪 table - 因此,每次将某些内容插入Publication
时,您都会处理整个Author
和Book
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)-有关详细信息,请参阅官方文档。