通过触发器同步一组表记录

时间:2016-04-04 09:41:33

标签: tsql triggers

我有一个来自现有产品的表(因此无法进行架构更改),其架构类似于以下内容:

objectId, typeId, value

我需要做的是基本上使几个typeId相互链接并保持同步。请参阅下面的示例。每组将有大约35组3-4个链接类型ID。

我无法找到合理的方法来执行高性能,处理多行插入并防止触发器递归。有什么建议吗?

实施例

typeId 1,2和3应该链接。

INSERT INTO foo (objectId, typeId, value) VALUES (1, 1, 'bar')

应该导致包含以下内容的表

╔══════════╦════════╦═══════╗
║ objectId ║ typeId ║ value ║
╠══════════╬════════╬═══════╣
║        1 ║      1 ║ bar   ║
║        1 ║      2 ║ bar   ║
║        1 ║      3 ║ bar   ║
╚══════════╩════════╩═══════╝

对这些记录中的任何一个值的任何更新都应该导致所有记录的值都被更改。

1 个答案:

答案 0 :(得分:0)

最后,我通过修改相关应用程序使用的“插入”和“更新”存储过程解决了我的问题,而不是用触发器解决它。

插入程序最终结果如下:

IF @typeId IN (1,2,3)
    INSERT INTO foo (objectId, typeId, value) VALUES (@objectId, 1, @value), (@objectId, 2, @value), (@objectId, 3, @value)
ELSE IF 
    ...
ELSE
   INSERT INTO foo (objectId, typeId, value) VALUES (@objectId, @typeId, @value)

更新程序最终结果如下:

IF @typeId IN (1,2,3)
    UPDATE foo SET value = @value WHERE objectId = @objectId AND @typeId IN (1,2,3)
ELSE IF
    ...
ELSE
    UPDATE foo SET value = @value WHERE rowId = @rowId