【问题标题】:Creating an update trigger is causing an error创建更新触发器导致错误
【发布时间】:2021-07-14 02:55:06
【问题描述】:

有两个触发器;第一个触发器运行良好,但我想在同一个表中添加另一个触发器。

第二个触发器是after update 触发器。请检查并告诉我这是对还是错,或者如果我们运行此触发器,它将运行完美与否

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [dbo].[tr_issueBook] 
ON [dbo].[IssueBooks] 
FOR INSERT
AS 
BEGIN
    DECLARE @IsbnNumber varchar(255)

    SELECT @IsbnNumber = ISBN_Number FROM inserted 

    UPDATE searchBooks 
    SET tbl_numberOfCopies = tbl_numberOfCopies - 1  
    WHERE tbl_IsbnBooks = @IsbnNumber
END

/******2nd Trigger ******/
CREATE TRIGGER [dbo].[tr_issueBook2]
ON [dbo].[IssueBooks]
AFTER UPDATE
AS 
BEGIN
    DECLARE @IsbnNumber varchar(255)

    SELECT @IsbnNumber = BookTitle FROM updated

    UPDATE searchBooks 
    SET tbl_numberOfCopies = [tbl_numberOfCopies] + 1 
    WHERE tbl_bookTitle = @IsbnNumber
END

我的第二个触发器抛出了一个错误:

更新了无效的对象名称

【问题讨论】:

  • 我们不能告诉你它是否完美——你的工作就是测试它,看看它是否满足你的需求。虽然我可以告诉你,这些触发器都不起作用。插入的是一个表,因此可以包含多行(或 0 行)。您需要以基于集合的方式(而不是程序方式)来处理它。而且您不一定需要 2 个触发器 - 您可以将逻辑组合成一个触发器 - 这可能会或可能不会执行得更好。
  • 参考这个often-shared link
  • @DaleK 当我在表中插入一些东西时,第一个触发器将完美运行,但是当我在同一个表中更新时,我想增加 +1。有可能
  • 如果你插入 2 行,只有 1 个(基本上是随机的)IsbnNumber 会被更新。试试看。
  • 没有updated 伪表可用于 AFTER UPDATE 触发器 - 只有 Inserted(更新后具有 新值),并且Deleted(更新前的旧值)

标签: sql sql-server tsql triggers


【解决方案1】:

您的两个触发器当前都已损坏,因为您没有处理 Inserted 伪表的行数多于或少于 1 的情况。您需要像对待任何其他表一样对待 Inserted 伪表并执行基于集合的操作而不是过程逻辑。

-- INSERT Trigger - using the Inserted pseudo table
update searchBooks set
    tbl_numberOfCopies = tbl_numberOfCopies - 1
where tbl_IsbnBooks in (select ISBN_Number from Inserted);
-- UPDATE Trigger - also using the Inserted pseudo table (There is no Updated table)
update searchBooks set
    tbl_numberOfCopies = tbl_numberOfCopies + 1
where tbl_IsbnBooks in (select ISBN_Number from Inserted);

我强烈推荐阅读Official Documentation

【讨论】:

  • 是的,你明白我的意思,但第二次触发应该是在更新之后。那怎么写呢?
  • 在我的第二次触发中,它给了我一个错误,无效对象名称已更新
  • 我也在回答中为您解决了这个问题。官方文档再次解释了这一切。
  • 感谢您的回复。但是当我提出问题时,它会阻止我 7 天。为什么会发生
  • @HafizDaniyal 我不知道......如果你收到了一个块,那肯定是有原因的。如果它解决了您的问题,请考虑接受此答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-22
  • 1970-01-01
  • 2019-05-03
  • 1970-01-01
  • 1970-01-01
  • 2011-09-11
  • 2013-07-16
相关资源
最近更新 更多