设为首页 加入收藏

TOP

SqlServerINSTEADOFUPDATE视图触发器问题(二)
2015-07-24 10:15:54 来源: 作者: 【 】 浏览:1
Tags:SqlServerINSTEADOFUPDATE 触发器 问题
图更新:

?

?

--	再对视图更新
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];

?

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇SQLite应用详解 下一篇SQL语言和T-SQL语言简介

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·如何从内核协议栈到 (2025-12-27 03:19:09)
·什么是网络协议?有哪 (2025-12-27 03:19:06)
·TCP/ IP协议有哪些 (2025-12-27 03:19:03)
·怎样用 Python 写一 (2025-12-27 02:49:19)
·如何学习python数据 (2025-12-27 02:49:16)