为啥要插入到 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 中创建架构,架构是干啥用的,为啥要创建架构,有啥好处?