Создание видов - с опцией CHECK - PullRequest
1 голос
/ 26 мая 2011

У меня есть пара вопросов, касающихся опции проверки в MySQL:

1) Я знаю, with check option не добавляет записи, которые не удовлетворяют условию WHERE в запросе выборки, используемом для определениявид, но что произойдет, если with check option не выбран?Зачем добавлять строки, которые не удовлетворяют условию WHERE?

2) В чем разница между LOCAL / CASCADED with check option?

Ответы [ 2 ]

4 голосов
/ 26 мая 2011

Без 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 будет больше единицы, поэтому часть запроса «подзапрос» приведет к удалению нового президента из набора результатов представления и эффективному откату транзакции.

3 голосов
/ 26 мая 2011

Думайте об этом больше, когда вы выполняете ОБНОВЛЕНИЕ. Когда вы выполняете UPDATE для базовой таблицы, а затем выполняете SELECT, только что обновленные строки остаются там.

Теперь представьте представление, которое выбирает строки из базовой таблицы на основании их идентификатора от 2 до 5, и пользователь выполняет следующие запросы:

SELECT * from View
UPDATE View set ID = ID + 3
SELECT * from View

Теперь вдруг строки исчезли.

...