复制写入触发器

时间:2014-10-07 16:28:28

标签: triggers sql-server-2008-r2 dml copy-on-write

我可以指望特殊触发器表格的顺序inserteddeleted是否相同?

如果没有,我该如何处理影响标识列的插入语句?

我有一个生产(主)数据库。我正在尝试设置一个开发数据库,​​它是生产数据库之上的一个层。在开发数据库中,我的应用程序不修改表,视图是生产数据库的同义词。我为它修改的表设置了视图。更新或插入这些视图时,数据将插入到辅助表而不是生产数据库表中。视图选择辅助表中的所有行,然后选择生产表中辅助表中不存在的所有行(比较位于主键列上)。

假设我的一个生产表是MainDB.App.Data,它的辅助表是MockDB.MockTables.Data,视图是MockDB.App.Data。我在视图上有一个触发器,用于更新或插入模拟表:

USE MockDB

CREATE TRIGGER App.DataTrigger
ON App.Data INSTEAD OF INSERT, UPDATE
NOT FOR REPLICATION AS
BEGIN
    SET NOCOUNT ON

    -- try updating
    UPDATE T1
    SET <all T1 columns to TI columns>
    FROM MockDB.MockTables.Data T1
    INNER JOIN (SELECT *, ROW_NUMBER() OVER (ORDER BY @@ROWCOUNT) as # FROM deleted) TD
        ON T1.Identity = TD.NotificationID
    INNER JOIN (SELECT *, ROW_NUMBER() OVER (ORDER BY @@ROWCOUNT) as # FROM inserted) TI
        ON TD.# = TI.#

    -- see if the update did something
    IF @@ROWCOUNT > 0
    BEGIN
        RETURN
    END

    -- insert rows that don't already exist in the mock table

    SET IDENTITY_INSERT MockDB.MockTables.Data ON

    INSERT INTO MockDB.MockTables.Data (<all columns>)
    SELECT * FROM inserted

    SET NOCOUNT OFF
    SET IDENTITY_INSERT MockDB.MockTables.Data OFF
END

0 个答案:

没有答案