2012-05-09 55 views
1

我有一个触发器,它是如下:TSQL触发行为异常

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 

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

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

本声明将插入4个新行htblB而不是2

可能请你能够解释为什么这是hapening以及如何防止它一些轻?

谢谢!

回答

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 
+0

可以请你帮我明白了,为什么这个工作? 谢谢! – OBL

+0

我想我明白了。因为两者的值相同。我愚蠢。 – OBL

+0

插入的表格为您提供刚刚更新的行,您需要将它们连接回基表。你可以在主键上进行连接,否则你将看不到正确的行。您取得了在category_value_id上​​匹配的所有行的组合 – Gratzy