tsql触发器异常行为

时间:2012-05-09 21:29:59

标签: tsql triggers

我有一个触发器,如下所示:

  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而不是2插入4个新行。

请您详细说明为什么会这样做以及如何预防?

谢谢!

1 个答案:

答案 0 :(得分:2)

我将假设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