SQL Server触发器触发,但结果很奇怪

时间:2016-11-17 20:50:42

标签: sql sql-server triggers

我在更新时设置了触发器。

如果我更新10行,则第一个IF块将向更改日志插入10行 但是下一个IF语句只会更新一行......而不是10行

第一个IF语句IF @attribute <> 'totalDescriptionLong'会触发10次,就像我预期的那样。

下一个IF声明IF @attribute = 'publishingStatus' 似乎只发射一次......即使我正在更新10行或更多行符合此条件......!

我不明白为什么代码的一部分以另一种方式行事

ALTER TRIGGER [dbo].[AttributeUpdate] 
ON [DemandwareDataHub].[dbo].     [RETAILEXPORTOUTPUTEXTHUBDWATTRIBUTE]
AFTER UPDATE
AS
    DECLARE @nOldValue int, @nNewValue int, 
            @attribute nvarchar(60), @attributeValue nvarchar(1999)

    SELECT @nNewValue = i.Active 
    FROM inserted i

    SELECT @nOldValue = d.Active FROM deleted d
    SELECT @attribute = i.ATTRIBUTE FROM inserted i
Select @attributeValue = i.ATTRIBUTEVALUE from inserted i

IF @attribute <> 'totalDescriptionLong'
BEGIN
    IF @nOldValue <> @nNewValue 
    BEGIN
        IF EXISTS(SELECT * FROM Inserted)
        BEGIN
            INSERT INTO [DemandwareDataHub].[dbo].[ChangeLog] (ReferenceRecid, EntityTypeID, ActionType, LogEntryDateTime, PimChangeDateTime, Processed)
            --values(       2, 1, 1, getdate(),getdate(),0)
            SELECT       i.RECID, 1, 1, getdate(), i.TIMESTAMP,0 from Inserted i
            --INSERT INTO ChangeLog (ReferenceRecid, EntityTypeID, ActionType) VALUES        (1, 1, 1)
        END
    END
    ELSE
    BEGIN
        IF EXISTS(SELECT * FROM Inserted)
        BEGIN
            INSERT INTO [DemandwareDataHub].[dbo].[ChangeLog] (ReferenceRecid, EntityTypeID, ActionType, LogEntryDateTime, PimChangeDateTime, Processed)
            --values(       2, 1, 1, getdate(),getdate(),0)
            SELECT       i.RECID, 1, 2, getdate(), i.TIMESTAMP,0 from Inserted i
            --INSERT INTO ChangeLog (ReferenceRecid, EntityTypeID, ActionType) VALUES        (1, 1, 1)
        END

    END
END

IF @attribute = 'publishingStatus'
BEGIN
    Declare @Product bigint, @Site nvarchar(60)
    Select @Product = i.PRODUCT from inserted i
    Select @Site = i.SITE from inserted i

    IF @attributeValue = 'proofedPriceCheck' 
    BEGIN
        --This product has been proofed and is ready for a price check
        Declare @PriceLocked bit 
        set @PriceLocked = 0
        SELECT        TOP (1)  @PriceLocked = a.PRICELOCKED
        FROM            RETAILEXPORTOUTPUTEXTDWPRICELOCKED AS a INNER JOIN
                                 SyncPimPriceBooks AS b ON a.ACCOUNTRELATION = b.CountryID
        WHERE        (a.PRODUCT = @Product) AND (b.SiteID = @Site)

        IF @PriceLocked = 1
        BEGIN
            UPDATE       RETAILEXPORTOUTPUTEXTHUBDWATTRIBUTE
            SET                ATTRIBUTEVALUE = 'proofed'
            WHERE        (PRODUCT = @Product) AND (SITE = @Site) AND (ATTRIBUTE = 'publishingStatus') 
        END
        ELSE
        BEGIN
            UPDATE       RETAILEXPORTOUTPUTEXTHUBDWATTRIBUTE
            SET                ATTRIBUTEVALUE = 'proofedPriceNotLocked'
            WHERE        (PRODUCT = @Product) AND (SITE = @Site) AND (ATTRIBUTE = 'publishingStatus') 
        END
    END

END

1 个答案:

答案 0 :(得分:2)

我认为这应该非常接近。我对插入非常有信心,但更新可能需要稍微调整一下。当然我大多猜测,因为我没有桌面结构,也没有100%确定你想要做什么。这应该非常接近。

insert [DemandwareDataHub].[dbo].[ChangeLog] 
(
    ReferenceRecid
    , EntityTypeID
    , ActionType
    , LogEntryDateTime
    , PimChangeDateTime
    , Processed
)
select i.RECID
    , 1
    , case when i.Active <> d.Active then 1 else 2 end
    , getdate()
    , i.TIMESTAMP
    , 0
from inserted i
join deleted d on d.RECID = i.RECID --or whatever the primary key column(s) are


 UPDATE RETAILEXPORTOUTPUTEXTHUBDWATTRIBUTE
 set ATTRIBUTEVALUE = case when re.PRICELOCKED = 1 then 'proofed' else 'proofedPriceNotLocked' end
 from inserted i
 join SyncPimPriceBooks b on b.SiteID = i.SITE
 join RETAILEXPORTOUTPUTEXTDWPRICELOCKED re on re.ACCOUNTRELATION = b.CountryID AND re.PRODUCT = i.PRODUCT
 where re.ATTRIBUTE = 'publishingStatus'