【问题标题】: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';

【问题讨论】:

  • 我指出它是最重要的答案,在回答您的第二个问题时可能会很有用(简而言之,假设视图支持插入,那么是的,值实际上被插入到表中)。对于您问题的第一部分,互联网上有大量这样做的示例。

标签: sql 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 中的任何子查询 视图的子句,就像它们适用于视图本身一样。一般来说, 数据库引擎必须能够明确地跟踪修改 从视图定义到一个基表。

【讨论】:

  • 谢谢你的回答,我真的相信这可以帮助未来的开发者更好地理解这个过程。我不知道为什么它被关闭了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-17
  • 2021-12-25
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多