【问题标题】:Trigger causing Transaction does not match connection触发导致事务不匹配连接
【发布时间】:2016-01-26 15:16:53
【问题描述】:

每当更新 table_A 中的值时,我有一个触发器插入/更新 table_B 中的值。在某些情况下(使用实体框架),此触发器会导致错误“事务与连接不匹配”。

有人有建议吗?

触发器的代码是这样的:

  CREATE TRIGGER dbo.SetLastUpdateOnTableB
  ON dbo.TableA 
  AFTER UPDATE
  AS
  BEGIN

   IF (NOT EXISTS(SELECT * FROM TableB WHERE personId = (SELECT TableA.Id From TableA INNER JOIN inserted ON TableA.Id = inserted.Id))) 
   BEGIN 
       INSERT INTO TableB(PersonId, LastUpdate) 
       VALUES((SELECT TableA.Id From TableA INNER JOIN inserted ON TableA.Id = inserted.Id), CURRENT_TIMESTAMP) 
   END 
   ELSE 
   BEGIN 
       UPDATE TableB 
       SET LastUpdate = CURRENT_TIMESTAMP
       WHERE personId = (SELECT TableA.Id From TableA INNER JOIN inserted ON TableA.Id = inserted.Id)
   END
  END
  GO

【问题讨论】:

  • 你的触发器坏了。 inserted 可以包含 0、1 或 多个 行。你需要重写你的语句来处理这个问题(事实上,在一次特定的运行期间,这些行中的 一些 可能代表新条目,而其中 一些 可能是现有条目,就TableB 而言。

标签: sql sql-server entity-framework triggers transactions


【解决方案1】:

Damien 是对的,触发器是错误的并导致错误。这里是更正的版本:

 CREATE TRIGGER dbo.SetLastUpdateOnTableB
 ON dbo.TableA 
 AFTER UPDATE
 AS
 BEGIN

  IF (NOT EXISTS(SELECT * FROM TableB WHERE personId IN (SELECT TableA.Id From TableA INNER JOIN inserted ON TableA.Id = inserted.Id))) 
  BEGIN 
      INSERT INTO TableB(PersonId, LastUpdate) 
      SELECT TableA.Id, CURRENT_TIMESTAMP From TableA INNER JOIN inserted ON TableA.Id = inserted.Id 
  END 
  ELSE 
  BEGIN 
      UPDATE TableB 
      SET LastUpdate = CURRENT_TIMESTAMP
      WHERE personId IN (SELECT TableA.Id From TableA INNER JOIN inserted ON TableA.Id = inserted.Id)
  END
 END
 GO

【讨论】:

  • 这仍然是部分损坏。想象一下更新TableA 中的两行。其中一个当前在TableB 中没有一行。另一个是。您的IF 只能选择一个操作或其他操作,而且这两行的操作都不正确。删除IF,只保留UPDATEINSERT,并使用WHERE 子句控制inserted 中的哪些行用于每个语句。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 2016-07-26
  • 1970-01-01
  • 2020-04-16
相关资源
最近更新 更多