3

视图上的工作如何CHECK OPTION?尝试更新视图时,它会成功。

CREATE TABLE [dbo].[Test](
    [Country] [nvarchar](20) NULL
) ON [PRIMARY]

INSERT [Test] VALUES ('England'), ('USA'), ('Australia');

CREATE VIEW dbo.TestView AS   
SELECT Country FROM  dbo.Test 
WHERE Country = N'USA'
WITH CHECK OPTION;

我尝试通过视图插入新行,但由于出现预期的错误消息,它按预期失败WITH CHECK OPTIONThe attempted insert or update failed because the target view either specifies WITH CHECK OPTION

INSERT INTO dbo.TestView (Country) VALUES (N'Canada');

但是,此更新意外成功:

UPDATE dbo.TestView  SET Country = N'ddsffd';

执行时不返回任何行SELECT * FROM dbo.TestView

这里发生了什么?

4

2 回答 2

3

UPDATE仅当基础表已包含WHERE满足VIEW. elseUPDATE语句不违反CHECK条件,因为VIEW.

查看:

CREATE TABLE [dbo].[Test](
    [Country] [nvarchar](20) NULL
) ON [PRIMARY];


CREATE VIEW dbo.TestView AS 
SELECT Country FROM
dbo.Test WHERE Country = N'USA'
WITH CHECK OPTION;
GO

INSERT INTO dbo.[Test] (Country) VALUES (N'USA');

UPDATE dbo.TestView 
SET Country = N'ddsffd';
于 2013-11-15T18:57:24.720 回答
0

您的案例在 MSSQL2008 中对我有用(INSERT 和 UPDATE 都被拒绝)。

请注意,如果视图的基表具有用于 INSERT 和/或 UPDATE 的 INSTEAD OF 触发器,则视图上的任何相应操作都会默默地忽略WITH CHECK OPTION(基于触发器可能会转换提供的值,因此视图不知道实际插入/更新的行是否会违反视图的过滤器)。

如果您遇到这种情况,您将被迫为视图上的 INSERT 和 UPDATE 编写 INSTEAD OF 触发器并自己检查过滤器。这确实意味着视图上的 INSERT 不会考虑基表中的 DEFAULT 子句,因此您必须将 ISNULL 应用于 INSERTED 中的值才能正确地将它们插入基表中)。

于 2015-03-27T10:11:27.367 回答