我可以指望特殊触发器表的顺序,inserted
并且deleted
,是否相同?
如果不是,我该如何处理影响标识列的插入语句?
我有一个生产(主)数据库。我正在尝试建立一个开发数据库,它是生产数据库之上的一层。在开发数据库中,我的应用程序未修改的表和视图是生产数据库的同义词。我为它修改的表设置了视图。当这些视图被更新或插入时,数据被插入到辅助表而不是生产数据库表中。视图从辅助表中选择所有行,然后从生产表中选择辅助表中不存在的任何行(比较在主键列上)。
假设我的一张生产表是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