1

次のようなトリガーがあります。

  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 に新しい行を挿入する必要があります。1 行だけが更新されれば問題なく動作します。ただし、複数の行の更新がある場合は、更新された行数の 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 行を挿入します。

なぜこれが起こっているのか、そしてそれを防ぐ方法を教えてください。

ありがとう!

4

1 に答える 1

2

IDが主キーであると想定します。その場合は、category_value_idではなく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
于 2012-05-09T21:35:13.170 に答える