为啥要插入到 SQL Server 中的视图中? [关闭]

Posted

技术标签:

【中文标题】为啥要插入到 SQL Server 中的视图中? [关闭]【英文标题】:Why would you insert into a view in SQL Server? [closed]为什么要插入到 SQL Server 中的视图中? [关闭] 【发布时间】:2015-12-15 00:28:28 【问题描述】:

在视图中插入与直接在表中插入相比有什么好处?例如场景 #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';

【问题讨论】:

Is it possible to insert data into a mysql view?的可能重复 我指出它是最重要的答案,在回答您的第二个问题时可能会很有用(简而言之,假设视图支持插入,那么是的,值实际上被插入到表中)。对于您问题的第一部分,互联网上有大量这样做的示例。 【参考方案1】:

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

关于“如何插入”,这是来自 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 子句的影响。

在视图的 select_statement 中的任何地方都没有使用 TOP 以及 WITH CHECK OPTION 子句。

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

【讨论】:

谢谢你的回答,我真的相信这可以帮助未来的开发者更好地理解这个过程。我不知道为什么它被关闭了。

以上是关于为啥要插入到 SQL Server 中的视图中? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能将 DBNull.Value 插入到 sql server 2005 中的可为空的图像字段中?

SQL server 2005 为何插入汉字显示问号,修改也修改不了,为啥啊?求解

sql server 中创建架构,架构是干啥用的,为啥要创建架构,有啥好处?

在 SQL Server 视图中插入重复行

sql server 中text的字段怎么存“字很多的文档”,直接复制粘贴?粘完后,为啥后面的字看不到?

我们 MSAccess 是不是可以通过 SQL Server 中的外部链接视图插入数据? [复制]