为什么建议人们不要通过视图进行更新


8

在大学期间,它不停地通过视图来更新表,而当我进入工作场所时,又告诉我们不要通过视图来更新数据库。

在何处/是否存在显着的性能影响?还是更多这样的情况,高级开发人员/ DBA告诉初级人员不要执行此操作,因为他们可能会由于不正确的联接而无意间造成严重破坏。

编辑
我正在使用MSSQL 2000-2008(取决于客户端的详细信息)


您正在使用哪个DBMS?
a_horse_with_no_name 2011年

@a_horse_with_no_name已更新以指示DBMS。我希望答案在所有DBMS中都相当通用。我天真吗?
Tim Sparg 2011年

您是在谈论自然可更新的视图,还是必须为其编写INSTEAD OF触发器的视图?我没听过这个建议,尤其是顺便说一句,您从未给出理由吗?
马丁·史密斯

@TimSparg:这取决于如何使视图可更新。如果使用instead of触发器,则不会有歧义,我看不出不使用触发器的理由。但是我对SQL Server不那么熟悉,所以我无法在没有触发器的情况下使用视图发表评论。
a_horse_with_no_name

@马丁史密斯我在谈论自然可更新的观点。有人模糊地告诉我,存在陷阱和性能问题,然后在我的工作场所加强了这一点,如果我们明确要求不要通过观点进行更新。我开始认为这只是一些高级离散事件/ DBA们会说,因为他们不喜欢解释通过视图要小心更新(IE内VS外部连接)
蒂姆SPARG

Answers:


10

为了不使用INSTEAD OF触发器就可以更新视图,“ SQL Server必须能够明确地跟踪视图定义到一个基本表的修改。”

更新这些视图没有性能上的劣势,因为SQL Server只会为受影响的基表生成查询计划。一个可能的缺点是,它增加了一层混淆,因此除非您将Views用作安全层,否则只编写直接更新基本表的代码就更加清楚了。

另一个可能是,如果视图包含一对多,JOIN并且您使用“多”端中的值更新“一个”端,则无法确定最终结果,但对SQL Server专有UPDATE ... FROM语法也是如此。您将需要使用MERGE或标量相关的子查询来避免此可能的问题。

对于不可更新且需要INSTEAD OF触发器的视图,由于需要从基表中生成inserteddeleted伪表,因此会对性能产生影响,因此,如果可能,直接更新基表可能会更有效。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.