我目前正在阅读 Microsoft 提供的有关视图的文档,但对我阅读的有关“带检查选项”的内容感到有些困惑。文档中没有提供任何示例。有人能给我一个简单的例子吗?我用例子更容易理解。
CHECK OPTION 强制针对视图执行的所有数据修改语句遵循 select_statement 中设置的条件。当通过视图修改行时,WITH CHECK OPTION 确保在提交修改后数据通过视图仍然可见。
这不意味着您不能通过视图进行此类更新,行将从视图中消失,因为where
您在视图中的任何语句都不再与该行匹配。
看法:
create view xxx as select * from table where status = 1
Run Code Online (Sandbox Code Playgroud)
使用表更新(确定):
update table set status = 2 where id = 3
Run Code Online (Sandbox Code Playgroud)
使用视图更新(不行):
update xxx set status = 2 where id = 3
Run Code Online (Sandbox Code Playgroud)
如果你这样做,它会使行消失
下面是一个显示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
Run Code Online (Sandbox Code Playgroud)
返回的错误是:
消息 550,级别 16,状态 1,第 30 行 尝试插入或更新失败,因为目标视图要么指定了 WITH CHECK OPTION,要么跨越指定了 WITH CHECK OPTION 的视图,并且该操作产生的一个或多个行不符合 CHECK 条件选项约束。
让我们用下面的例子来理解
\n\nCREATE VIEW PortlandAreaAddresses_vw\nAS\nSELECT AddressID,\nAddressLine1,\nCity,\nStateProvinceID,\nPostalCode,\nModifiedDate\nFROM Person.Address\nWHERE PostalCode LIKE \xe2\x80\x98970%\xe2\x80\x99\nOR PostalCode LIKE \xe2\x80\x98971%\xe2\x80\x99\nOR PostalCode LIKE \xe2\x80\x98972%\xe2\x80\x99\nOR PostalCode LIKE \xe2\x80\x98986[6-9]%\xe2\x80\x99\nWITH CHECK OPTION;\n
Run Code Online (Sandbox Code Playgroud)\n\n在这种情况下,如果您尝试插入记录,CHECK OPTION 将强制遵循为邮政编码指定的 4 条规则
\n\nWHERE PostalCode LIKE \xe2\x80\x98970%\xe2\x80\x99\nOR PostalCode LIKE \xe2\x80\x98971%\xe2\x80\x99\nOR PostalCode LIKE \xe2\x80\x98972%\xe2\x80\x99\nOR PostalCode LIKE \xe2\x80\x98986[6-9]%\xe2\x80\x99\n
Run Code Online (Sandbox Code Playgroud)\n\n这意味着您无法插入“19970”等邮政编码
\n