在视图中插入与直接在表中插入有什么好处?例如场景#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)
通常,如果用户没有被授予对基础表的权限,他们可能会插入到视图中。
关于“如何插入”,这是来自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 子句中的任何子查询,就像它们适用于视图本身一样。通常,数据库引擎必须能够清楚地跟踪从视图定义到一个基表的修改。