我正在研究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中的行:
这是我在消息窗口中看到的:
这意味着触发器没有将记录插入到我的队列表中。什么想法可能是错的?
答案 0 :(得分:0)
@Lamak看起来是正确的;偶然发现这个有点迟了但也许这些信息可以帮助别人。
Sicon开发了第三方附加组件,可帮助审核更改。这可能涵盖了您的需求。
Sage 200的大多数集成使用每个表中的OpLock字段来确定上次编辑日期。
SLCustomerLocation表可以保存单个SLCustomerAccountID的多个记录,因此您可能需要将这一点与您的脚本一起考虑。