在SQL Server 2005中,我使用SELECT
语句创建了一些视图。我们可以在视图中编写UPDATE
和DELETE
语句吗?
答案 0 :(得分:18)
视图中要修改的列必须直接引用表列中的基础数据。它们不能以任何其他方式派生,例如通过:
正在修改的列不受GROUP BY,HAVING或DISTINCT子句的影响。
并查看剩下的文章......
答案 1 :(得分:12)
您可以从视图中删除这是您要求的,但您不能拥有删除信息的视图。视图是基础表的一部分数据。如果您具有权限,则可以在视图中对表进行相同的数据操作。
所以你可以这样做:
DELETE FROM my_View WHERE id = 3;
答案 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)
如果视图是可更新的视图或不可更新的视图,答案就在于答案。
可更新视图是一个视图,其中包含基础表中的所有非空列。
如果是这样,对视图的更新,删除和插入查询会影响基础实际表上的数据。
多数民众赞成.....