Программирование баз данных MS SQL Server (1084479), страница 61
Текст из файла (страница 61)
Подобное положение дел может быль обусловлено, например, тем, что во время проектирования базы данных не были учтены какие-то требования, из-за чего, допустим, в таблице 1пчоТСТпд появились некоторые строки, содержащие отрицательное значение суммы оплаты по счету-фактуре. В связи с этим возникает необходимость добавить правило, не позволяющее вводить в базу данных счета-фактуры с отрицательными значениями суммы, но вместе с тем оставить неизменными существующие строки. Чтобы ввести в действие новое ограничение, но исключить его применение к существующим данным, можно включить опцию Н1ТН НОСНЕСК при подготовке оператора АКИТЕН ТАНЕЕ, предназначенного для добавления нового ограничения. Как обычно, рассмотрим применение этой опции на примере. Таблица Сияговегя, созданная в базе данных Ассопппупд, имеет столбец Р11опе.
Столбец Рпопе был создан с типом данных сПэг, поскольку предполагалось, что все номера телефонов будут иметь одинаковую длину. Кроме того, для столбца РПопе было задано значение длины 15, чтобы обеспечить наличие места, достаточного для размещения в поле РЬопе всех необходимых форматирующих символов. Тем не менее в объявлении таблицы Спяповегя ничего не было предусмотрено для обеспечения того, чтобы строки, вставляемые в таблицу базы данных, действительно соответствовали требуемым критериям форматирования. Чтобы убедиться в этом, вставим строку со значением номера телефона в формате, не соответствующем ожиданиям, но допустим при этом такую ошибку, которая действительно может встретиться на практике при вводе номера телефона: 1НБЕЕТ 1НТО Спяповегя ~спягсвегкяве, Аппяеяя1, АсЫгеяя2, Супу, зсасе, Еьр, Соппясп, Рьппе, Геп1внп, Пяпе1пзуяпев) УАШПЕЯ Снуспяп', '123 Апуеьеге', 240 Глава 6 'Вено', НУ, вовов, ' Тое ВоЬ', '555-1212', '9312345б7', ЯЕТОАТЕ ()) Теперь введем в действие ограничение, позволяющее управлять форматированием поля РЬопе: АЬТЕВ ТАВЬЕ Спятовегя АОО СОНБТВАХНТ СН СпятовегРЬопено СНЕСК (Рпопе (,ХКЕ '([0-9][0-9)[0-9]) [0-9)[0-9][0-9) — [0-9][0-9][0-9][0-9]') Но после вызова этого оператора на выполнение появляется следующее сообщение об ошибке: Мяо 547, Ьете1 16, Бтате 1, Ьтпе 1 АЬТЕВ ТАВЬЕ ягатевепт соп111стес( е1ГЬ СОЬОММ СНЕСК сопятга1пг 'СН СпятовегРЬопено'.
Тье соп111ст оссптте4( Ьп 4(атаЬаяе 'Ассоппстпв', ГаЫе 'Спятоветя', со1пвп 'Рпопе'. СУБД ЯЯ. Бегуег вводит ограничение в действие только при том условии, что существующие данные соответствуют критериям, заданным в ограничении. В связи с этим для ввода ограничения в действие необходимо либо исправить существующие данные, либо ввести опцию М1ТН НОСНЕСК в оператор АЬТЕВ. Для этого достаточно дополнительно указать ключевое слово 9)ХТН МОСНЕСК в операторе АЬТЕВ, как показано ниже.
АЬТЕВ ТАВЬЕ Сиятоветя ИХТН НОСНЕСК Аоо СОНБТВАХНТ Сн СпятовегРЬопено СНЕСК (Рпопе ЬХКЕ ' ([ 0-9] [0-9] [0-9] ) [ 0-9] [0-9] [ 0-9] - [0-9] [ 0-9 ] [ 0-9] [0-9] ' ) Если после этого будет снова вызван на выполнение тот же оператор ХМБЕВТ, введенное ограничение проявит свое действие н попытка ввода данных будет отвергнута (напомним. что в прошлый раз этот оператор вставки был выполнен беспрепятственно): Мяч 547, Ьеее1 1б, Бсате О, ЬЬпе 1 Тпе АЬТЕВ ТАВЬЕ ятатевепт соп111стеО е1ГЬ Гпе СНЕСК сопясгатпт "СН СпятовегРЬопено". Тпе соп111ст оссптгео тп оатаЬаяе "Ассоппт1пч", ГаЫе "НЬо.спятовегя", со1пвп 'Рпопе'.
После того как оператор 1ИБЕВТ будет исправлен с учетом введенного ограничения, а затем снова вызван на выполнение, операция вставки строки завершится успешно: ХНБЕВТ 1НТО Спятовегя (Спятовегнаве, Ас(сгеяя1, Ао4(теяя2, Сгту, Ограничения л41 бпапе, 21р, Соппасп, Рвопе, Ре 10но, Вапегпзуяпее) ЧАВВЕЯ ('Муспяп', '123 Апуквепе', 'Репо', 80808, пзое ВОЬ', '(800)555-1212', '931234567', сетВАте ()) Теперь выполним оператор ЯЕВЕСт применительно к таблице Спяговегя.
Приведенные ниже результаты показывают, что в столбце рпопе этой таблицы имеются данные и соответствующие, и несоответствующие критериям ограничения СНЕСК. ЯЕЬЕСТ Спяповегно, Спяпоеегнаве, Рпопе РВОМ Спяповегя Спяпотегно Спясовегпате Рвопе В111у ВОЬ'я Впоея Спяпопег1 Муспяп Муспяп (360) 555-1234 553-1212 555-1212 (800) 555-1212 (2 гое(я) аббеопео) Введенные ранее данные сохранены, поскольку отсутствует информация, позволяющая внести в них уточнения, а ввод новых данных осуществляется только после проверки их соответствия вновь заданным критериям. Временная отмена существующего ограничения Выше было описано, в связи с чем может потребоваться, чтобы прн вводе в действие новых ограничений не проверялись существующие данные, а в этом разделе будет показано, из-за чего может возникнуть необходимость временной отмены существующего ограничения.
Прежде всего следует отметить, что ввод в БД таких данных, в отношении которых заведомо известно, что они неправильны, может быть вызван той же причиной, по которой используется опция Х1ТН МОСНЕСК вЂ” в базу данных требуется ввести существующие данные. Существующими данными могут оказаться не только те данные, которые были введены ранее в базу данных.
К такой категории могут также относиться данные, импортируемые из эксплуатировавшейся ранее базы данных или из какой-то другой системы. Но так или иначе, при вводе этих данных возникает та же проблема — имеются некоторые существующие данные, которые не соответствуют правилам, заданным с помощью ограничений, но эти данные все равно должны быть введены в таблицу. Безусловно, одним из способов решения этой задачи может стать уничтожение ограничения, ввод требуемых данных, а затем повторное задание того же ограни- 242 Глава 6 чения с использованием опции Х1ТН НОСНЕСК. Но это — слишком сложный способ! К счастью, можно обойтись без выполнения всех этих действий.
Вместо этого достаточно выполнить оператор АЕТЕК с опцией ИОСНЕСК, который отменяет действие рассматриваемого ограничения. Ниже приведен пример, в котором показано, как отменить ограничение СНЕСК, введенное в действие в одном из операторов из предыдущего раздела. АЬтЕК ТАВЬЕ Сизсовегз ИОСНЕСК СОМБТКА1МТ СИ СпзсовегРЬопено После этого можно снова выполнить тот же оператор 1ИБЕКТ, который, как уже было проверено ранее, отвергается СУБД ВО) Яегуег, если ограничение введено в действие: 1ИБЕКТ 1ИТО Спзссвегз )Спзсовегмаве, Аппгезз1, Аспгезз2, Сьсу, Бсасе, зьр, Сопсасс, Рпопе, Гес)10но, Оасе1пзузсев) ЧАЬОЕБ ) мус зг, '123 Апуэпеге', 'Кепс', 80808, 'Тое ВОЬ', '555-1212', '931239567', ОЕТОАТЕ()) На этот раз с помощью оператора 1МБЕКТ удается ввести в таблицу данные, не соответствующие условиям ограничения.
В связи с указанной возможностью отменять ограничения представляет также интерес вопрос о том, как узнать, отменено ли действие какого-то конкретного ограничения, или нет. Способ такой проверки, основанный на том, что подготавливается фиктивная строка н предпринимается попытка вставить ее в таблицу, чтобы проверить, действует ли заданное ограничение, был бы слишком трудоемким. К счастью, в СУБД ВОг Зегуег предусмотрена процедура, позволяющая определить состояние ограничения (а также, разумеется, много других процедур, позволяющих находить ответы на большинство, но не все подобные вопросы).
В данном случае достаточно применить уже знакомую нам процедуру зр Ье1рсопзггайпС. Оператор, с помощью которого можно использовать эту процедуру применительно к таблице спзсовегз, является несложным: ЕХЕС зр Ье1рсопзсгаьпс Сизсовегз Ограничения 243 Объем результатов, предоставляемых этой процедурой, слишком велик для того, чтобы эти результаты можно было привести на страницах этой книги, но отметим, что во втором результирующем наборе, вырабатываемом этой процедурой, имеется столбец зсаспз епабьесь Приведенная в указанном столбце информация позволяет узнать состояние каждого ограничения, а в данном случае для рассматриваемого ограничения должно быть указано состояние 01эаЬ1еб (Отменено).
После того как появится возможность снова ввести в действие требуемое ограничение, можно просто разрешить его использование, выполнив такой же оператор АЬТЕН, но с опцией СНЕСК вместо опции ИОСНЕСК: АЬтЕЕ тАВЬЕ Спзговегз СНЕСК Сснзтвдтнт СН Спзсовегвьопено После вызова на выполнение того же оператора 1ИЯЕНТ для проверки функционирования ограничения появится такое же сообщение об ошибке, как и раньше: Нзо Е47, Ье е1 1Е, Зсапе З, Ь е 1 Тпе 1НЯЕЕТ эсасевепс соп111ссез э1ГЬ Гпе СНЕСК сопесга1пс "СИ Сизсавегпасе1пзуэсев". Тпе соп111сс осспггеп Тп оасаЬазе "Ассоипс1по", ГаЬ1е "ЬЬо.спзповегз", со1пвп 'Еаьетпзузсев'.
Тпе зсасевепс Ьаз Ьееп Гегвапасеб. Безусловно, и в данном случае рекомендуется снова вызвать на выполнение процедуру зр Ье1рсопэсга1пс и ознакомиться с содержимым столбца эсаспз епаЬ1есЬ Если в этом столбце указано состояние ЕпаЬ1еб (Разрешено), то рассматриваемое ограничение снова должно действовать. Конструкции, подобные ограничениям, правила и значения, применяемые по умолчанию Такие конструкции, как правила и заданные по умолчанию значения, были предусмотрены в СУБД БО) Яегуег намного раньше, чем ограничения СНЕСК и ЕЕЕАНЬТ.