Без WITH CHECK OPTION
, обновление (INSERT
/ UPDATE
/ MERGE
/ DELETE
и т. Д.) Просматриваемой таблицы приведет к обновлению ее базовых базовых таблиц независимо от условия WHERE
в VIEW
(при условии, что СУБД считает представление обновляемым).Если вы INSERT
строка в VIEW
, которая не удовлетворяет условию WHERE
, затем обновите VIEW
, то вновь вставленная строка не будет видна в VIEW
.WITH CHECK OPTION
предотвратил бы такую «странную» ситуацию, но это еще не все.
Рассмотрим VIEW
, созданный для разрешения определенного пользователя (группы пользователей, приложения и т. Д.).) просматривать только подмножество строк в таблице, например, чтобы позволить им просматривать данные для персонала, не позволяя им просматривать сведения об исполнительных сотрудниках: отзовите привилегии на чтение в базовой таблице для этого пользователя и вместо этого предоставьте их в представлении.WITH CHECK OPTION
позволяет вам сделать то же самое для привилегий записи, в этом случае он запретил бы INSERT
просмотру представления, если бы он создал строку исполнительного сотрудника.
Подобные методы могут использоваться для принудительного применения 'ограничения на уровне строк, например, что компания может иметь только одного президента, если принудительно ввести INSERT
через VIEW
, чье предложение WHERE
допускает только одного сотрудника на компанию.
Как вы можете определить условие, что «компания может иметь только одного президента»
Вот простой пример (без FK и т. д.) с использованием стандартного SQL:
CREATE TABLE Employees
( company_id CHAR(8) NOT NULL,
employee CHAR(10) NOT NULL UNIQUE,
job_title VARCHAR(20) NOT NULL );
CREATE VIEW Presidents
AS
SELECT *
FROM Employees
WHERE job_title = 'president'
AND 1 >= ( SELECT COUNT(*)
FROM Employees e
WHERE e.job_title = 'president'
GROUP
BY e.company_id )
WITH CHECK OPTION;
INSERT INTO Employees VALUES ( 'Acme', '1', 'president' );
INSERT INTO Employees VALUES ( 'Acme', '2', 'president' );
Вторая вставкапроисходит сбой, потому что это приведет к тому, что число президентов для компании Acme
будет больше единицы, поэтому часть запроса «подзапрос» приведет к удалению нового президента из набора результатов представления и эффективному откату транзакции.