为什么要插入SQL Server中的视图?

时间:2015-12-15 00:28:28

标签: sql view

直接插入视图与表格有什么好处?例如情景#1

如果视图只有表中的几列,您仍然可以成功插入吗?例如情景#2

场景#1:

CREATE TABLE dbo.tbl1 
(
    ID INT NOT NULL,
    NAME VARCHAR(32) NOT NULL  
);

CREATE VIEW dbo.vw_x 
AS
    SELECT ID, Name
    FROM dbo.tbl1
    WHERE ID = 2

INSERT INTO dbo.vw_x
SELECT 2, 'Name';

场景#2:

CREATE TABLE dbo.tbl1 
(
    ID INT NOT NULL,
    NAME VARCHAR(32) NOT NULL  
);

CREATE TABLE dbo.tbl2 
(
    ID INT NOT NULL,
    VALUE VARCHAR(32) NOT NULL  
);

CREATE VIEW dbo.vw_x 
AS
    SELECT t1.ID, t2.Value
    FROM dbo.tbl1 t1
    INNER JOIN dbo.tbl2 t2
        ON t1.ID = t2.ID
    WHERE t1.ID = 2

INSERT INTO dbo.vw_x
SELECT 2, 'Name';

1 个答案:

答案 0 :(得分:3)

通常,如果用户未被授予对基础表的权限,则可能会插入到视图中。

关于"如何插入",这是来自CREATE VIEW语句的MSDN article

  

可更新视图

     

您可以修改基础基表的数据   通过视图,只要满足以下条件:

     
      
  • 必须进行任何修改,包括UPDATE,INSERT和DELETE语句   仅来自一个基表的引用列。

  •   
  • 视图中要修改的列必须直接引用表列中的基础数据。无法以任何其他方式派生列,例如通过以下方式:

         

    聚合函数:AVG,COUNT,SUM,MIN,MAX,GROUPING,STDEV,STDEVP,VAR和VARP。

         

    计算。无法从使用其他列的表达式计算列。通过使用集合运算符UNION,UNION ALL,CROSSJOIN,EXCEPT和INTERSECT形成的列相当于计算并且也不可更新。

  •   
  • 正在修改的列不受GROUP BY,HAVING或DISTINCT子句的影响。

  •   
  • TOP不会在视图的select_statement中的任何位置与WITH CHECK OPTION子句一起使用。

  •   
     

以前的限制适用于FROM中的任何子查询   视图的子句,就像它们适用于视图本身一样。通常,   数据库引擎必须能够明确地跟踪修改   从视图定义到一个基表。