带有“with check option”的SQL视图

时间:2017-01-29 16:41:06

标签: sql sql-server

我目前正在阅读微软关于观点的文档,对于我所读到的“with check option”,我感到很困惑。文档中没有提供任何示例。有人能让我举个简单的例子吗?我通过例子更容易理解。

  

CHECK OPTION强制执行所有执行的数据修改语句   视图遵循select_statement中设置的条件。当一个   通过视图修改行,WITH CHECK OPTION确保   修改后,视图中的数据仍然可见   提交。

3 个答案:

答案 0 :(得分:3)

这是否意味着您无法通过视图进行此类更新,因为视图中的where语句与行不匹配,行将从视图中消失了。

查看:

create view xxx as select * from table where status = 1

使用表格更新(ok):

update table set status = 2 where id = 3

使用视图更新(不行):

update xxx set status = 2 where id = 3

如果你这样做,它会使行消失

答案 1 :(得分:1)

以下是显示CHECK OPTION行为的示例。

CREATE TABLE dbo.Table1(Col1 int);
CREATE TABLE dbo.Table2(Col2 int);
INSERT INTO dbo.Table1 (Col1) VALUES(1);
INSERT INTO dbo.Table2 (Col2) VALUES(1);
GO

CREATE VIEW dbo.ViewWithCheckOption
AS
SELECT Table1.Col1, Table2.Col2
FROM dbo.Table1
JOIN dbo.Table2 ON Table1.Col1 = Table2.Col2
WITH CHECK OPTION;
GO

CREATE VIEW dbo.ViewWithoutCheckOption
AS
SELECT Table1.Col1, Table2.Col2
FROM dbo.Table1
JOIN dbo.Table2 ON Table1.Col1 = Table2.Col2;
GO

SELECT Col1, Col1 FROM dbo.ViewWithoutCheckOption; --returns 1 row
INSERT INTO dbo.ViewWithoutCheckOption(Col1) VALUES(2); --succeeds
SELECT Col1, Col1 FROM dbo.ViewWithoutCheckOption; --still returns 1 row

SELECT Col1, Col1 FROM dbo.ViewWithCheckOption; --returns 1 row
INSERT INTO dbo.ViewWithCheckOption(Col1) VALUES(2); -- fails with error 

返回的错误是:

  

Msg 550,Level 16,State 1,Line 30尝试插入或更新   失败,因为目标视图指定WITH CHECK OPTION或   跨越指定WITH CHECK OPTION和一行或多行的视图   操作产生的结果不符合CHECK OPTION的条件   约束

答案 2 :(得分:0)

使用以下示例让我们理解

CREATE VIEW PortlandAreaAddresses_vw
AS
SELECT AddressID,
AddressLine1,
City,
StateProvinceID,
PostalCode,
ModifiedDate
FROM Person.Address
WHERE PostalCode LIKE ‘970%’
OR PostalCode LIKE ‘971%’
OR PostalCode LIKE ‘972%’
OR PostalCode LIKE ‘986[6-9]%’
WITH CHECK OPTION;

在这种情况下,如果您尝试插入记录,则CHECK OPTION将强制执行为PostalCode指定的4条规则

WHERE PostalCode LIKE ‘970%’
OR PostalCode LIKE ‘971%’
OR PostalCode LIKE ‘972%’
OR PostalCode LIKE ‘986[6-9]%’

这意味着您不能插入“ 19970”之类的邮政编码