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

Tim*_*arg 8 sql-server-2008 view

在大学期间,我们一直在想不要通过视图更新表,当我进入工作场所时,我们又被告知不要通过视图更新数据库。

在哪里/是否对执行此操作有显着的性能影响?或者这更像是高级开发人员/DBA 告诉初级人员不要这样做的情况,因为他们可能会无意中因不正确的连接而造成严重破坏。

编辑
我使用的是 MSSQL 2000-2008(取决于客户的具体情况)

Mar*_*ith 11

对于无需使用INSTEAD OF触发器即可更新的视图,“SQL Server 必须能够清楚地跟踪从视图定义到一个基表的修改。” .

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

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

对于那些不能进行更新,需要查看INSTEAD OF触发有作为对性能的影响inserteddeleted伪表需要从基表产生的,所以如果可能的更新的基表直接将可能是更有效的。