本来印象中视图是不能的 刚刚百度了下 发现单表视图可以进行update 这之间到底是 什么关系 求大神
------解决方案--------------------
1、插入记录
通过视图插入数据与直接向表中插入数据一样,但通过视图插入数据时引用的字段为视图中的字段,和表中字段不一定完全相同,故有如下规则:
1)使用插入语句的用户必须拥有在基本表中插入数据的权限。
2)若视图中未包括基表中属性为NOT NULL的字段时,操作失败。
3)若基表中的字段因规则或约束而不接受,从视图插入的数据操作失败。
4)若视图中包含有统计函数结果或多个字段值的组合,操作失败。
5)若视图中使用了distinct,group by短句,操作失败。
6)若视图中使用with check option,则操作失败。因为插入新记录时,即使该记录不满足创建视图时定义的限制条件,仍然可以向表中插入数据记录,但通过视图查询数据时不会显示出新插入的记录。若想防止插入不符合视图定义的数据可使用WITH CHECK OPTION选项来进行限制。
7)对多表连接的视图来讲,一个插入语句只能对单独某个表的字段进行操作。
2、修改数据:同数据表的修改
3、删除记录
同数据表的删除操作,但就注意如下:
1)通过视图删除数据将最终体现为从基表中删除数据。 当一个视图由两个以上基表构成时,不允许删除视图中的数据。
2)若视图中的字段是常数或统计结果的话,允许执行delete操作,但不允许insert或update操作。
绝大部分我已经测试过,环境为05,仅供参考!
------解决方案--------------------
USE [GTS]
GO
/****** 对象: Table [dbo].[tb] 脚本日期: 06/12/2014 08:57:38 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF OBJECT_ID('tb') IS NOT NULL
DROP TABLE TB
CREATE TABLE tb (col1 INT,col2 INT)
INSERT INTO tb
SELECT '1','2' UNION ALL
SELECT '3','4'
IF OBJECT_ID('tb_a') IS NOT NULL
DROP TABLE tb_a
CREATE TABLE tb_a (col1 INT,col2 INT)
INSERT INTO tb_a
SELECT '11','22' UNION ALL
SELECT '33','44'
--SELECT * FROM tb
--SELECT * FROM tb_a
CREATE VIEW view_tb_a
AS
SELECT * FROM tb
UNION ALL
SELECT * FROM tb_a
---SELECT * FROM view_tb_a
UPDATE view_tb_a SET col1=0 WHERE col1=1
/*UNION ALL 视图 'GT.dbo.view_tb_a' 不可更新,因为在表 '[GT].[dbo].[tb]' 上没有找到主键。*/