2010-04-15 168 views

回答

22

看到Using Views in Microsoft SQL Server

当通过视图 修改数据(即,使用INSERT或UPDATE 语句)的某些限制存在 取决于视图的类型。访问多个表的视图 只能修改视图中其中一个表的 。 使用函数的视图,指定 DISTINCT,或使用GROUP BY 子句可能不会更新。 另外,插入数据是禁止的以下类型的 视图 :

* views having columns with derived (i.e., computed) data in the SELECT-list 
* views that do not contain all columns defined as NOT NULL from the tables from which they were defined 

还可以插入或 更新数据通过这样的观点,即 的数据不再通过 即查看访问,除非已经指定WITH CHECK OPTION。

+0

有通过视图插入如此多的告诫,我个人觉得它简单直接插入到表。毕竟,为了符合规则,并且您知道没有理由不直接更新或插入表,您仍然需要查看哪些字段会出现在哪张表中。 – HLGEM 2010-04-16 13:42:57

+0

我从来没有在视图上实际执行UPDATE或INSERT,但如果您有可用于快速查找需要更改的行的索引视图,则可能会有所帮助。在这种情况下,我将构建更新唯一目的的视图。 – 2010-04-16 13:59:33

12

是的。

视图中的数据不存在独立于构成视图的表的存在。本质上,这个视图是一个伪装成表的存储SELECT语句。数据存储在原始表格中,并且只有在您想查看时才“组装”到视图中。如果视图是可更新的(并非所有视图都是),则更新将应用于表数据。

+0

我明白你的观点。但是出现了一个新问题,如果视图只是一个选择语句,那么视图上的索引如何维护。所有索引都会在有人查询视图时立即重建。 – 2010-04-15 20:10:11

+1

只有在基础表上,视图上没有索引。当您从视图请求数据时,DBMS使用这些索引组装不同表中的行。 (这忽略了一种相当新的观点,即数据库存储数据的“影子”副本的“物化视图”,有效地为你预先计算视图)。 – 2010-04-15 20:16:50

5

您可以在视图上使用触发器对实际表格执行插入/更新/删除操作。

http://www.devarticles.com/c/a/SQL-Server/Using-Triggers-In-MS-SQL-Server/1/

+4

我很欣赏我对答案的反馈,但如果它是否定的,为什么没有人评论?如果错了,我想纠正。 – 2010-04-16 18:30:54

+4

该问题明确询问更新视图的效果。提出替代方案非常好,但它并不能回答这个问题。 – Dan 2016-03-10 16:14:13