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

Tig*_*z32 4 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';
Run Code Online (Sandbox Code Playgroud)

场景#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';
Run Code Online (Sandbox Code Playgroud)

Nat*_*ths 7

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

关于“如何插入”,这是来自CREATE VIEW 语句的MSDN 文章

可更新的视图

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

  • 任何修改,包括 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 子句中的任何子查询,就像它们适用于视图本身一样。通常,数据库引擎必须能够清楚地跟踪从视图定义到一个基表的修改。

  • 感谢您的回答,我坚信这可以帮助未来的开发人员更好地理解该过程。我不知道为什么它被关闭了。 (2认同)