图更新:
?
?
-- 再对视图更新
UPDATE [VTestTab] SET [value]=10 WHERE id = 1
?
从执行计划看,视图是有更新了!,查看跟踪的表,也尝试更新并实际更新了!!~

再查看表中的记录,值却没有变化!~更新视图却没有反应到具体的表中!~
SELECT * FROM [VTestTab] WHEREid= 1
值没有变化是正常的,因为触发器里没有定义更新的语句,但是从跟踪来看,视图的确是有更改的!~
现在改回原来的触发器:
?
ALTER TRIGGER [dbo].[tgr_VTestTab_update]
ON [dbo].[VTestTab] INSTEAD OF UPDATE
AS
UPDATE [VTestTab] SET
[name] = T2.[name],
[insertDate] = T2.[insertDate],
[value] = T2.[value],
[info] = T2.[info]
FROM [VTestTab] AS t1, inserted AS t2 WHERE t1.id = t2.id
GO
-- 再对视图更新
UPDATE [VTestTab] SET [value]=100 WHERE id = 1
?
发现是有两个执行计划,从前面可以知道,第一个执行计划是没有实际更新的,它更新的是视图,没反馈到表中,只有第二次在触发器内部定义的更新操作才有用!~
那么问题就来了:为什么视图的更改没有反应在具体表中??难道微软所说的约束是在视图和表之间阻止了?(待解决)
现在开始说下最初遇到的错误吧!~
?
-- 关联更新,有错误!~
UPDATE t1 SET t1.[value]=t2.[value]
FROM [VTestTab] t1 join #TestTab t2 on t1.id=t2.id
消息 414,级别 16,状态 1,第 1 行
不允许使用 UPDATE,因为该语句会更新视图 "VTestTab",而该视图参与联接并且有一个 INSTEAD OF UPDATE 触发器。
?
上面直接更新单个视图是正常的,唯有连接其他表更新时,才出现错误。
听说这个问题的出现,从07年已经提出了吧,只是一直没有被修复,不清楚 SqlServer 2014 修复了没有!~
有两种解决方法,但是性能不是很好!
?
--【方法一】
UPDATE [VTestTab] SET
[value] = (SELECT [value] FROM #TestTab T WHERE [VTestTab].id=T.id) ,
[info] = (SELECT [info] FROM #TestTab T WHERE [VTestTab].id=T.id)
WHERE EXISTS(SELECT * FROM #TestTab K WHERE [VTestTab].id=K.id)
--【方法二】
MERGE INTO [VTestTab] AS T1
USING #TestTab AS T2 ON T1.id=T2.id
WHEN MATCHED THEN UPDATE
SET T1.[value] = T2.[value],T1.[info] = T2.[info];
?