MSSQL数据库表触发INSERT / UPDATE事件后不将记录插入另一个表

时间:2016-03-07 16:10:00

标签: sql-server triggers database-trigger

我正在研究MSSQL数据库(对于一个名为Sage 200的程序)。数据库中有许多表,但是,我希望通过特定表上的Trigger通知更改(插入新记录或更新现有记录)。

我还想支持同时更新此表上的多行。

当插入或更新记录时,我想从表中获取一个特定字段,并插入/更新具有该字段值的另一个表。

所以,要把它放到透视中;触发器如下所示:

CREATE TRIGGER [dbo].[IC_CustomerLocationChanges] ON [dbo].[SLCustomerLocation]
AFTER INSERT,UPDATE
AS
BEGIN

    SELECT RowNum = ROW_NUMBER() OVER(ORDER BY SLCustomerAccountID) , SLCustomerAccountID
    INTO #CustomerLocationChanges
    FROM INSERTED;

    DECLARE @MaxRownum INT;
    SET @MaxRownum = (SELECT MAX(RowNum) FROM #CustomerLocationChanges);

    DECLARE @Iter INT;
    SET @Iter = (SELECT MIN(RowNum) FROM #CustomerLocationChanges);

    WHILE @Iter <= @MaxRownum
    BEGIN

        -- Get Customer account Id
        DECLARE @SLCustomerAccountID INT = (SELECT SLCustomerAccountID FROM #CustomerLocationChanges WHERE RowNum = @Iter);

        -- Check If Customer Doesn't Already Exist In Queue Table
        IF ((SELECT COUNT(*) FROM IC_CustomerUpdates WITH (NOLOCK) WHERE SLCustomerAccountID = @SLCustomerAccountID) > 0)
        BEGIN

            -- Insert new record
            print 'Insert [CustomerCreate] Queue Entry | SLCustomerAccountID : ' + CAST(@SLCustomerAccountID AS VARCHAR(255));
            INSERT INTO IC_CustomerUpdates (SLCustomerAccountID, Synced) VALUES
            (@SLCustomerAccountID, 0);

        END
        ELSE
        BEGIN

            -- Update existing record
            print 'Update [CustomerCreate] Queue Entry | SLCustomerAccountID : ' + CAST(@SLCustomerAccountID AS VARCHAR(255));
            UPDATE IC_CustomerUpdates SET Synced = 0 
            WHERE SLCustomerAccountID = @SLCustomerAccountID;

        END

        SET @Iter = @Iter + 1;

    END

    DROP TABLE #CustomerLocationChanges;

END
GO

为了测试这个,我运行了以下查询:

update SLCustomerLocation SET AddressLine2 = AddressLine2 + ' test' 
where SLCustomerAccountID = 1019

select * from IC_CustomerUpdates

这不会返回IC_CustomerUpdates中的行:

enter image description here

这是我在消息窗口中看到的:

enter image description here

这意味着触发器没有将记录插入到我的队列表中。什么想法可能是错的?

1 个答案:

答案 0 :(得分:0)

@Lamak看起来是正确的;偶然发现这个有点迟了但也许这些信息可以帮助别人。

Sicon开发了第三方附加组件,可帮助审核更改。这可能涵盖了您的需求。

Sage 200的大多数集成使用每个表中的OpLock字段来确定上次编辑日期。

SLCustomerLocation表可以保存单个SLCustomerAccountID的多个记录,因此您可能需要将这一点与您的脚本一起考虑。