2017-01-29 2 views
0

В настоящее время я читаю документацию Microsoft о просмотрах, и я немного смущен тем, что я прочитал о опции «с проверкой». В документации нет примеров. Может ли кто-нибудь сделать мне простой пример? Я понимаю легче с примерами.SQL view with «with check option»

ОПЦИИ ПРОВЕРКИ Принудительно выполнять все заявления о модификации данных, выполненные против , чтобы следовать критериям, установленным в select_statement. Когда строка модифицируется с помощью вида, OPCH CHECK OPTION гарантирует, что данные остаются видимыми через представление после того, как выполнена модификация .

ответ

1

Разве это не означает, что вы не можете сделать такое обновление с помощью представления, что строка (s) исчезнет из вида из-за то, что where заявления вы имеете в представлении не будет соответствовать строке больше ,

Вид:

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

обновление с помощью таблицы (ОК):

update table set status = 2 where id = 3 

обновление с помощью представления (не в порядке):

update xxx set status = 2 where id = 3 

и если бы это сделать , это приведет к исчезновению строки

+0

так что, если строка не будет показана после вставки/обновления/удаления из представления, «с опцией проверки» не позволит мне сделать изменения правильно? – pete

+0

Да, вот как это работает –

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, уровень 16, состояние 1, строка 30 Попытка вставки или обновления не удалась, поскольку целевой вид либо указывает WITH CHECK OPTION или охватывает вид который указывает WITH CHECK OPTION и одну или несколько строк , возникшие в результате операции, не подпадают под ограничение CHECK OPTION .