ПРЕДИКАТЫ И ИСКЛЮЧЁННЫЕ ПОЛЯ
Похожая проблема, о которой вы должны знать, включает в себя вставку строк в представление с предикатом, базирующемся на одном или более исключённых полях. Например, может показаться разумным создание Londonstaff, как здесь:
CREATE VIEW Londonsta1t AS SELECT snum, sname, comm FROM Salespeople WHERE city = 'London';
В конце концов, зачем включать значение city, если все значения city будут одинаковыми?
А как будет выглядеть картинка, получаемая всякий раз, когда мы пробуем вставить строку?
Так как мы не можем указать значение city как значение по умолчанию, этим значением, вероятно, будет NULL, и оно будет введено в поле city (NULL используется, если другое значение по умолчанию не было определено. См. подробности в Главе 18). Так как в этом случае поле city не будет равняться значению London, вставляемая строка будет исключена из представления.
Это будет верным для любой строки, которую вы попробуете вставить в просмотр Londonstaff. Все они должны быть введены с помощью представления Londonstaff в таблицу Продавцов, а затем исключены из самого представления (если определением по умолчанию был не London, то это особый случай). Пользователь не сможет вводить строки в это представление, хотя всё ещё не известно, может ли он вводить строки в базовую таблицу. Даже если мы добавим WITH CHECK OPTION в определение представления,
CREATE VIEW Londonstate AS SELECT snum, sname, comm FROM Salespeople WHERE city = 'London' WITH CHECK OPTION;
проблема не обязательно будет решена. В результате этого мы получим представление, которое мы могли бы модифицировать или из которого мы могли бы удалять, но не вставлять в него. В некоторых случаях это может быть хорошо; хотя, возможно, нет смысла пользователям, имеющим доступ к этому представлению, иметь возможность добавлять строки. Но вы должны точно определить, что может произойти, прежде чем вы создадите такое представление.
Даже если это не всегда может обеспечить вас нужной информацией, полезно включать в ваше представление все поля, на которые имеется ссылка в предикате. Если вы не хотите видеть эти поля в вашем выводе, вы всегда сможете исключить их из запроса в представлении, в противоположность запросу внутри представления. Другими словами, вы могли бы определить представление Londonstaff так:
CREATE VIEW Londonstaff AS SELECT * FROM Salespeople WHERE city = 'London' WITH CHECK OPTION;
Эта команда заполнит представление одинаковыми значениями в поле city, которые вы можете просто исключить из вывода с помощью запроса, где указаны только те поля, которые вы хотите видеть:
SELECT snum, sname, comm FROM Londonstaff;