【问题标题】:tsql trigger behaves abnormallytsql 触发器行为异常
【发布时间】:2012-05-10 05:40:53
【问题描述】:

我有一个触发器如下:

  ALTER TRIGGER [trigger_CATEGORY_VALUE_ID] ON [dbo].[tblA]
FOR UPDATE
AS
SET NOCOUNT ON
IF ( UPDATE([CATEGORY_VALUE_ID]))
BEGIN
  INSERT INTO [dbo].[htblB]
  ( ID
  , CATEGORY_VALUE_ID
  , STATUS_END_DATE
  , STATUS_END_DATE_SOURCE)
  SELECT
  t.ID
  , t.CATEGORY_VALUE_ID
  , GETDATE()
  , t.UPDATE_SOURCE
  FROM [dbo].[tblCAPITATION] t
  INNER JOIN inserted ins
  ON t.CATEGORY_VALUE_ID = ins.CATEGORY_VALUE_ID 
END

它需要做的是在更新列 CATEGORY_VALUE_ID 时在 htblB 中插入一个新行。如果只更新一行,它工作正常。但是如果它有多个行更新,那么 2 的行数的幂更新的新行数被插入到 htblB 中。

UPDATE dbo.tblCAPITATION
SET CAPITATION_STATUS_CATEGORY_VALUE_ID = '80574', UPDATE_SOURCE = 'TEST3'
WHERE CAPITATION_ID = 2 OR CAPITATION_ID = 3

此语句将向 htblB 插入 4 个新行,而不是 2 个。

请您解释一下为什么会出现这种情况以及如何预防?

谢谢!

【问题讨论】:

    标签: tsql triggers


    【解决方案1】:

    我将假设 ID 是主键,如果是这样,那么你应该加入插入 ID 而不是 category_value_id

    ALTER TRIGGER [trigger_CATEGORY_VALUE_ID] ON [dbo].[tblA]
    FOR UPDATE
    AS
    SET NOCOUNT ON
    IF ( UPDATE([CATEGORY_VALUE_ID]))
    BEGIN
      INSERT INTO [dbo].[htblB]
      ( ID
      , CATEGORY_VALUE_ID
      , STATUS_END_DATE
      , STATUS_END_DATE_SOURCE)
      SELECT
      t.ID
      , t.CATEGORY_VALUE_ID
      , GETDATE()
      , t.UPDATE_SOURCE
      FROM [dbo].[tblCAPITATION] t
      INNER JOIN inserted ins
      ON t.ID = ins.ID
    END
    

    【讨论】:

    • 我想我明白了。因为两者都更新了相同的值。我真傻。
    • 插入的表为您提供刚刚更新的行,您需要将它们连接回基表。您将在主键上执行该连接,否则您将无法获得如您所见的正确行。您得到了与 category_value_id 匹配的所有行组合
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 2011-06-02
    相关资源
    最近更新 更多