Программирование баз данных MS SQL Server (1084479), страница 100
Текст из файла (страница 100)
Внесение изменений в данные с помощью представлений в условиях использования операций соединения Если в операторе выборки, лежащем в основе представления, затрагивается больше чем одна таблица, то в большинстве случаев применение этого представления для модификации данных не допускается, если не предусмотрено использование триггера 1ЕБТЕАР ОЕ (как уже было сказано, дополнительная информация об этом будет приведена ниже). Корпорацией М)сгоэой было принято решение запретить по умолчанию модификацию данных с помощью представлений, в которых используется несколько таблиц, поскольку при этом возникают некоторые неоднозначности при выборе способов реализации операций внесения изменений. Но разработчик может взять на себя обязанности по устранению противоречий, используя триггер 1ИЯТЕАР ОЕ для анализа данных, подвергаемых модификации, и явно указывая СУБД Я11Е Яегчег, какие действия необходимо выполнить с модифицируемыми данными.
392 Глава 10 Обязательное соблюдение требования об использовании в представлении всех столбцоц не допускающих неопределенных значений, или о применении заданных по умолчанию значений По умолчанию, если для вставки данных используется представление, то необходимо предусмотреть возможность передачи в операторе вставки значений во все обязательные столбцы (столбцы, которые не допускают использования Х1)1.1:значений). Кроме того, само это представление должно содержать в основополагающем запросе оператор ЯЕЕЕСТ, относящийся к единственной таблице, или по крайней мере вставка данных с помощью представления должна ограничиваться воздействием только на одну таблицу а также должны быть предусмотрены данные для всех обязательных столбцов.
Следует отметить, что требование задавать значения для всех обязательных столбцов не подразумевает указания всех этих столбцов в списке выборки основополагающего оператора ЯЕЬЕСТ представления. Дело в том, что для предоставления значений, которые должны быть вставлены в столбцы, не допускающие использования неопределенных значений, вполне могут быть применены заданные по умолчанию значения. Таким образом, чтобы обеспечить вставку данных с помощью представления, выполняя операторы 1НЯЕНТ, достаточно обеспечить, чтобы этим представлением были охвачены все столбцы, для которых не предусмотрены заданные по умолчанию значения и которые не допускают наличия в них Х1)1.1:значений.
Вполне очевидно, что единственный способ достичь этой цели в любых обстоятельствах состоит в применении триггера 1НЯТЕАР ОР. Проверка данных, вставляемых с помощью представлениц— ключевое слово таттн СНИК ОРтГОИ Многие средства СУБД ЯО?. Яегтег мало известны в широких кругах разработчиков, а возможности, предоставляемые конструкцией Н1ТН СНЕСК ОРТ10Ы, относятся к числу наименее известных.
В основе применения этой конструкции лежит простое правило — обновление или вставка данных с помощью представления, в котором задана конструкция Х1ТН СНЕСК ОРТ10Н, осуществляется, только если строка, полученная в результате применения этой операции обновления или вставки, соответствует критериям, допускающим ее включение в это представление. Иначе говоря, строка, полученная в результате вставки или обновления, должна соответствовать критериям конструкции ННЕНЕ, которая определена в операторе ЯЕЬЕСТ, лежащем в основе представления. Применение конструкции ы1тн снеск Орт10н Чтобы рассмотреть, как используется конструкция ь>1тн снеск Орт10н, продолжим работу с базой данных ноге)>ньпб и с помощью приведенного ниже оператора создадим представление, в котором отображаются данные только о поставщиках из штата Орегон. Количество столбцов, которые могут рассматриваться как применимые для работы с таблицей Япьррегэ, ограничено, поэтому для определения того, в каком штате находится поставщик, нам придется использовать коды городов (но вначале не забудьте указать, что используется база данных Ноге)>н1пс1).
СВЕАТЕ ЧТЕИ огедоззпгррегэ ~ю АЯ Представления 393 НЕРЕСТ ЯЬ1ррег1Р, Сотрапунате, Рьопе РНОМ ЯКЕрр в ИНЕНЕ Рьопе ЫКЕ '(503) а' ОН РЬопе ЫКЕ '(541)Ъ' ОК Рьопе ЫКЕ '(971)Ъ' И1ТН СНЕСК ОРТ10Н ЯЬ1ррегТР Рьопе Сотрапунап1е (503) 555-9831 (503) 555-3199 (503) 555-9931 (503) 555-55бб Яреес)у Ехргевв Рп1Сес) Расха9е Рес(ега1 ЯЬ1рр1пд Яреес(у Яьаррегв, 1пс. (4 гои(в) аббесСео) Теперь предпримем попытку обновить одну из строк с помощью этого представления — задать номер телефона, содержащий код города, отличный от любого из допустимых значений, т.е. начинающийся с подстроки, которая отличается от (503), (541) или (971): ОРРАТЕ ОгечопЯЬгррегв хя ЯЕТ РЬопе = '(333) 55 9831' ИНЕНЕ ЯЬТррег10 = 1 Попытка выполнить этот оператор немедленно приводит к формированию в СУБД НОТ.
Бегуег следующего сообщения об ошибке: Мвч 550, Ьехе1 1б, Яеасе 1, Ьапе 1 ТЬе ассетрсес( Тпвегс о ореабе Та11ес) Ьесвове Гме Гаг9ес чгеь ебсьег врес1бгев И1ТН СНЕСК ОРТ10Н ог врала в гаек СЬах врес181ев И1ТН СНЕСК ОРТХОН апп опе ог тоге гоив гево1сгпч бгот сье орегас1оп с(1с)пох Чоа11бу опс(ег ГЬе СНЕСК ОРТ10И сопвбгаупг.
ТЬе вгабетепв Ьвв Ьееп Гегт1пасео. Описание полученных результатов В конструкции ХНЕЕЕ предусмотрено условие выборки, согласно которому в представление входят только строки, содержащие в поле с номером телефона значения кодов городов (503], (541) или (971), а конструкция Х1ТН СНЕСК ОРТ10М указывает, что любые данные, вставляемые или обновляемые с помощью операторов 1МЯЕНТ или РРРАТЕ, должны соответствовать критериям, заданным в конструкции ХНЕНЕ (тогда как код города (333) этим критериям не соответствует). Приведенный выше оператор обновления не соответствует критериям конструкции ХНЕНЕ, поэтому отбрасывается.
Но попытка вставить эти же данные непосредственно в базовую таблицу: ОРРАтЕ Яьурре в ЯЕТ РЬопе = '(333) 555 9831' ИНЕНЕ ЯЫррег10 = 1 После вызова на выполнение оператора ЯЕЬЕСТ * применительно к этому представлению обнаруживается, что происходит возврат всех строк таблицы (поскольку все строки в таблице соответствуют критериям, заданным в определении представления): 394 Глава 10 не рассматривается в СУБД ЕЯ) Зегуег как неправильная, поэтому вырабатывается следующее сообщение: (1 гое(в] аЕТессеб) Таким образом, проверка, предусмотренная в конструкции Х1ТН СНЕСК ОРТ10М, применяется только к представлению, а не к основополагающей таблице.
В определенных обстоятельствах возможность выбрать, использовать ли для модификации данных таблицу или представление, может действительно оказаться весьма удобной. Представьте себе такую ситуацию, когда требуется разрешить некоторым пользователям вставлять или обновлять данные в таблице, но только если обновляемые или вставляемые данные соответствуют определенным критериям. Безусловно, можно было бы легко реализовать подобное условие, предусмотрев использование ограничения СНЕСК на основополагающей таблице, но такое решение не всегда является идеальным. Дело в том, что может потребоваться учесть еще одно такое пожелание, чтобы некоторые пользователи имели возможность вводить данные в таблицу с помощью операторов 1МЯЕНТ без учета указанных критериев. Но ограничение СНЕСК не позволяет предоставить разным пользователям различные возможности.
А определив представление с конструкцией Х1ТН СНЕСК ОРТ10М, можно предоставить пользователям с ограниченными правами возможность применять для вставки данных только представление, а полноправным пользователям дать возможность выбирать — осуществлять ли вставку данных непосредственно в базовую таблицу или использовать представление, в тех случаях, если вставляемые данные соответствуют условиям, заданным в представлении. Чтобы убедиться в том, что проверка данных, модифицируемых с помощью представления, распространяется и на операторы вставки, вызовем на выполнение оператор 1МЯЕНТ, который содержит данные, противоречащие условиям в конструкции ХНЕНЕ представления: 1МЯЕЕТ 1МТО Огеоопзп1ррегв че ЧЛЬОЕЕ ('Му Рге1оЬС 1пс.', '(555) 555-5555') При осуществлении этой попытки, как и прежде, появляется уже знакомое сообщение об ошибке, в котором говорится о прекращении выполнения оператора: Иве 550, Ьеее1 16, ЗСаге 1, 11пе 1 Тпе аггетргеб Тпвегг ог ирбаге Га11еб Ьесаиве Спе Сагоег ч1ее еьгпег вреогбгея Х1ТН СНЕСК ОРТ1ОМ ог арапа а чьее СпаС вресгб1ев Х1ТН СНЕСК ОРТ1ОМ апб опе ог еоге гоев гевп1С1по Тгоп Спе орегагьоп б1б поС чпа11гу ппбег Спе СНЕСК ОРТ10М сопвгга1пС.
Тпе вгаСевепС Лав Ьееп СегегпаСеб. Представления 395 Редактирование представлений с помощью средств языка ЗО1 Для внесения изменений в определения представлений применяются два способа, основанные на использовании операторов языка БЯЬ: модификация представления с помощью оператора А1,ТЕК Ч1ЕХ или его уничтожение и повторное создание с помощью оператора СКЕАТЕ ЧТЕХ. Но при использовании оператора АЬТЕК Ч1ЕХ следует помнить, что его выполнение также приводит к полной замене существующего представления. Различия между способами модификации определения представления, в которых используется оператор АЬТЕК Ч1ЕХ или СКЕАТЕ Ч1ЕИ, заключаются лишь в следующем: С1 при выполнении оператора АЬТЕК Ч1ЕХ предполагается, что рассматриваемое представление уже существует, а при выполнении оператора СКЕАТЕ Ч1ЕХ такое предположение не делается; С1 после выполнения оператора АЬТЕК Ч1ЕХ сохраняются все права на использование представления, предоставленные пользователям; С1 после выполнения оператора АЬТЕК Ч1ЕХ сохраняется вся информация о зависимостях.