我们可以在视图中编写更新和删除查询吗?

时间:2010-06-27 13:52:06

标签: sql-server view

在SQL Server 2005中,我使用SELECT语句创建了一些视图。我们可以在视图中编写UPDATEDELETE语句吗?

7 个答案:

答案 0 :(得分:18)

来自此MSDN文章:Modifying Data Through a View

  • 任何修改(包括UPDATE,INSERT和DELETE语句)都必须仅引用一个基表中的列。
  • 视图中要修改的列必须直接引用表列中的基础数据。它们不能以任何其他方式派生,例如通过:

    • 聚合函数(AVG,COUNT,SUM,MIN,MAX,GROUPING,STDEV,STDEVP,VAR和VARP)。
    • 计算;无法使用其他列从表达式计算列。使用set运算符(UNION,UNION ALL,CROSSJOIN,EXCEPT和INTERSECT)形成的列相当于计算,也不可更新。
  • 正在修改的列不受GROUP BY,HAVING或DISTINCT子句的影响。

  • 当指定了WITH CHECK OPTION时,TOP不能在视图的select_statement中的任何位置使用。

并查看剩下的文章......

答案 1 :(得分:12)

您可以从视图中删除这是您要求的,但您不能拥有删除信息的视图。视图是基础表的一部分数据。如果您具有权限,则可以在视图中对表进行相同的数据操作。

所以你可以这样做:

DELETE FROM my_View WHERE id = 3;

When to use views
What is a view

答案 2 :(得分:3)

如果我按照

怎么办?
Create view table1_View 
as 
   select * 
   from table1 

go 

delete 
from table1_view

我检查了这个命令,删除了table1的所有数据

答案 3 :(得分:2)

**

  

使用视图更新数据:

** 视图可用于更新数据的查询,但受一些限制。请记住,视图不是表并且不包含数据 - 实际修改始终在表级别进行。视图不能用作覆盖基表中定义的任何约束,规则或参照完整性的机制。

通过视图更新数据的限制 您可以在视图中插入,更新和删除行,但受以下限制:

如果视图包含多个表之间的连接,则只能在视图中插入和更新一个表,并且不能删除行。

您无法根据联合查询直接修改视图中的数据。您无法修改使用GROUP BY或DISTINCT语句的视图中的数据。

正在修改的所有列都受到与直接针对基表执行语句相同的限制。

无法通过视图修改文字和图片列。

没有检查查看条件。例如,如果视图选择所有居住在巴黎的客户,并且数据被修改为添加或编辑没有City =' Paris'的行,则数据将在基表中修改但是除非在定义视图时使用WITH CHECK OPTION,否则视图中不会显示。 有关详细信息,请查看此Article

答案 4 :(得分:1)

除了视图本身允许的有限更新外,您还可以使用INSTEAD OF触发器执行更多相关更改。 INSTEAD OF基本上允许您拦截更新或删除,并执行几乎任何更改。参考文献:MSDN Article

答案 5 :(得分:1)

关于Srinivas的更多解释回答了......

任何修改(包括UPDATE,INSERT和DELETE语句)都必须仅引用一个基表中的列。

只要您可以管理基表结构,就可以使用INSTEAD OF触发器来解决此问题。 INSTEAD OF触发器允许您覆盖视图上的INSERT,UPDATE或DELETE操作。例如,您可以在视图上定义INSTEAD OF INSERT触发器以替换标准INSERT语句。

假设您创建了以下视图:

CREATE VIEW AuthorsNames

AS

SELECT au_id, au_fname, au_lname

FROM authors 

您可能希望将数据插入视图中不可见的列。为此,请在视图上创建一个INSTEAD OF触发器来处理插入。

CREATE TRIGGER ShowInsert on AuthorsNames

INSTEAD OF INSERT

AS

BEGIN

INSERT INTO authors

   SELECT address, au_fname, au_id, au_lname, city, contract, phone, state, zip

   FROM inserted

END

使用此方法可以插入多个表,但如果处理大量基础表,则会变得更加复杂。 Ref MSDN

答案 6 :(得分:0)

如果视图是可更新的视图或不可更新的视图,答案就在于答案。

可更新视图是一个视图,其中包含基础表中的所有非空列。

如果是这样,对视图的更新,删除和插入查询会影响基础实际表上的数据。

多数民众赞成.....