当前位置: 代码迷 >> Sql Server >> 视图终究能不能进行增删改
  详细解决方案

视图终究能不能进行增删改

热度:32   发布时间:2016-04-24 10:34:27.0
视图到底能不能进行增删改
本来印象中视图是不能的    刚刚百度了下 发现单表视图可以进行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]' 上没有找到主键。*/
  相关解决方案