Программирование баз данных MS SQL Server (1084479), страница 59
Текст из файла (страница 59)
Это привело бы к тому, что значительное количество строк в таблице Огбегз оказалось бы связанным со строкой данных о служащем, который фактически не вводил эти заказы. Таким образом, в базе данных появились бы неверные данные (к сожалению). По умолчанию СУБД ЬЯЕ Ьегчег противодействует появлению висячих строк, поэтому не позволяет применять операции удаления или обновления строк к таблице, указанной в ссылке (в данном случае к таблице Ежр1оуееэ). Такое условие перестает действовать только после удаления или обновления всех зависимых строк из ссылиощейся таблицы (в данном случае таблицы Огоегз).
': В действительности. ситуации„,орисанные выше„наглядно иллюстрируют 'необходймссть'.до;: 'лдлнительнбго обсу)клелия того,' в каках условиях примейение каска)(нмхдбйствий'оправда-': , но и не оправдано.'йассмотоимкратко зту тему, г)осколькудля нав очень важнообеспечить ": целостность дайных; то:погвидимому,:ие следуетдблускйтьудвлениедвнных о служащем;, : ИЭ табЛйЦЫ,"ЕжР1ОУева',,'ЕСЛИ.ЕСтЬ:ЗаВИСИМЫЕ'От НИХ ОТРОКИ В;табЛИЦЕ'Осгпася' тахгхах." .
4анные 6' введенных закагзах, отчастй теряют,':смысл', если яесво)змчожнб,определить, какой' 'служа)ций ввел:эти заказы; С'другой стоббны;"операция,, прбдусмйтриааю)лдб смену'иден-.. тифбкатогра служащего:, может оказаться вполне доп))от)ямой:(даже если можетс()здатьоя ' впечатление, что лричийегдля выполнения;тсакого'дейстгвия является;весьма надуманной)'.: '.
Дело атом:;, что отрицателы)ыхлоследствийсмены идентиФиквтора Служащего можно из- . ::бежать, лредУсм6треа е таблица огс~егв: койвтрукцию ОАЕСВРЕ, дапуСКЕюЩуЮ(сбиовленив;: -Йа';оснуовании изложенного: мчохо)о сделать' 'еще один 'вывод'- — ' применение,хонструк(ахи' . Олэсйое поотноашуегнию колерациям обйовления иудгалейиянедолжноч быть основййо на , одинаковом псс ходе; Возможность иелолвзования указанной конструкции в обоих этих слу-: чаях должно бассматливатьсл отдельно'(и анализироваться очень тщательно).
Ограничения 233 Вполне очевидно, что даже после определения внешнего ключа только на одной таблице фактически налагаются конкретные условия на некоторые действия, осуществляемые применительно к обеим таблицам (а если внешний ключ ссылается на ту же таблицу, то оба набора условий распространяются на одну и ту же таблицу). Ограничения оы~ЯоЕ ; ЙОтяьИЧИЕОтОГраНИЧ5вййя ЛЕраИЧНОГО КЛХ)на„'ПрИИЕНЕНИЕ ртраНЛИЧЕН)(я СИ1()ИЕНЕ Прнацант-' , К,ТСМУ,'ЧТО аатсиг'атИЧЕСКИ-:ИСКЛЮЧаатов:ЯРЗМОФНОСТЬ'аотаантвьа:СдотавтотаУ(СЦ(нй.СТСЛФЕЦ ::, (х()0:,зйачейие;:В да))нбм случае возмшкйрсть п()имейе)и(и МОи*значенийтзааисит отто)(С. ' "КаК Задала Олдня ИИЬЬ дяя ухаэаННОГС СТОЛбца тМЛИ((((„йа СЛЕдуатгуЧИтыаатычлтс дажЕ"" :еряиертйака",ис)О:,здачрний разрешена,"(рактичйсди доиускаетре(вставка",е столбец ус((ь:--' КО'ОдНОГО ТЕКЕ(т) ЗНаЧЕНИИ(ХОтя: Одйр МЙА-ЕНЕЧЕИИр НЕ раанв. друтЕМу М)Ы.гэвакрНИК); В ТОЧКИ ЗРЕНИЕ,ПРгИМЕНЕНИИ,,ОГРаНИЧЕНйиь)ИХДЖ ЕтнаНаЧЕНИЯ'-аоЕРааНОРЕССМатРИВЕЕТУСИ:.
иек дублйкеты)( Итак, к описанию данного ограничения больше нельзя что-либо добавить (к тому же прн его изучении применим основной объем сведений, касающихся первичных ключей), поэтому приступим непосредственно к изучению примеров кода. Для этого создадим еще одну таблицу в базе данных Ассоппьгпд, но на этот раз наювем ее Я)тьррегэ: СВЕАТЕ ТАВЬЕ Яньррегэ ( Яитррег10 гпг РК1НАНУ КЕУ, Збтррегнаве чагснзг(30) АсЫгеэз чагс)|аг(30) стгу чагснаг(25) згзге с)1аг (2) зги чагснаг(10) Рвсвено чагсва (14) Ои1ООе 10ЕИТ1ТУ ИОТ ИОЬ1 иот ипьь, иот иоьь, ИОТ ИОЬЬ, ИОТ ИОЬ)., иот ипьь, ИОТ ИОЬ1 Тема, касающаяся ограничений ОИТЯОЕ, является относительно простой.
По существу эти ограничения почти полностью соответствуют ограничениям первичного ключа, поскольку требуют наличия уникальных значений во всем указанном в них столбце (или в комбинации столбцов) таблицы. Ограничения ОИ10ОЕ часто называют ограничениями альтернативных ключей.
Основные различия между ограничениями ОИ10ОЕ и ограничениями первичного ключа состоят в том, что в качестве ограничений ОИ1ООЕ обычно не применяются уникальные идентификаторы строк таблицы (даже несмотря на то, что данные в столбцах, на которых определено ограничение ОИЬЯОЕ, фактически могут использоваться таким образом), а, кроме того, на таблице может быть задано несколько ограничений ЫИ1ООЕ (напомним, что в расчете на каждую таблицу может быть задан только один первичный ключ).
После того как будет задано ограничение ЫИ1ООЕ, должно соблюдаться такое условие, чтобы все значения в столбцах, указанных в этом ограничении, были уникальными. При обнаружении попытки обновить или вставить строку со значением, которое уже имеется в столбце с ограничением уникальности, СУБД ЯОг. Яегчег вырабатывает сообщение об ошибке и отклоняет попытку ввести такую строку. 234 Глава 6 После этого необходимо вызвать на выполнение процедуру яр [те1рсопясга100 применительно к таблице Я[г1ррегя и проверить, действительно ли таблица Яйтрре гя была создана с учетом требуемых ограничений.
Создание ограничений тЛбТ0тж на существующих таблицах Как уже было сказано, ограничение УН1ОУЕ действует в основном по таким же принципам, как ограничения первичных и внешних ключей. Рассмотрим следующий пример создания ограничения УН1ОУЕ на таблице Елгр1оуеея: ЛЬтвв тЛВЬЕ Е р1оуееа ЛОВ СОНЯткптит ЛК Енр1оуееЯЯН УИ1ЯУЕ (ЯВИ[ Сразу же после применения процедуры яр Ье1рсопзсга1пс обнаруживается, что ограничение создано в соответствии с запланированным действием и правильно указаны столбцы. относящиеся к ограничению. Отметим, что в п[уиведенном выше тфимеРе абЕгевиату[уа АК, исполыуемал в имени огРаничения, расшиф[товывоетгл как АИегнаге Кеу [альтернативный ключ).
С д[тугой спкфоны для обозначения не)уличных нлюъш и внтиних ключт1 применяются аббревиатуры рк ~Ртттату Кеу) и ЕК (Роте(дп Кеу). А в именах ограничений УМ1ЯУЕ часто исполыуетсл префикс УЯ или тфостло У. Ой РЕЕНИЧЕНИай СНЕСК Таблица 6.3. Примеры применения ограничения СНЖСК Назначение Код Зй[. Ветхеен 1 лнр 12 Обеспечение применения в столбце иопсп только допустимых значений 11КЕ ' [0-9[ [0-9[ (0-9[- [0-9[ [0-9]- [0-9[ [0-9] [0-9[[0-9[' Правильное форматирование номера карточки социального обеспечения ти ('ОВЯ', 'Гаа Ех', 'УЯВЯ'[ Регламентация списка допустимых значений в поле ялгррега Ог1сгшсе >= 0 Регламентация применения только положительных значений цены ЯвьрОака >= огавсрате Ссылка нв другое поле в той же строке Удобным свойством ограничений СНЕСК является то, что эти ограничения не обязательно должны применяться только к какому-то конкретному столбцу. Безусловно, указанные ограничения могут относиться лишь гс некоторому столбцу, но также допускается их распространение по существу на всю таблицу, в том смысле, что с их помощью может осуществляться проверка значений в одном столбце на основании значений другого столбца [при условии.
что все эти столбцы принадлежат к одной и той же таблице, а значения берутся из одной и той же обновляемой или вставляемой строки). С помощью ограничений СНЕСК может также осуществляться проверка того, соответствует ли некоторое сочетание значений столбцов заданному критерию. Ограничения СНЕСК определяются на основании таких же правил, которые распространяются на операции проверки, используемые в конструкции ЯНЕКЕ.
Примеры критериев, которые могут применяться в ограничении СНЕСК, приведены в табл. 6.3. Ограничения 2Ы В действительности в табл. 6З приведена лишь незначительная часть всех возможных примеров, поскольку количество вариантов применения различных операций сравнения в конструкции СНЕСК является практически бесконечным. В ограничении СНЕСК может быть задано почти любое такое же выражение, которое допускается задавать в конструкции ИНЕНЕ.
К тому же ограничения СНЕСК позволяют достичь гораздо более высокой производительности по сравнению с альтернативными средствами проверки допустимости данных (правилами и триггерами). Продолжая ряд примеров, основанных на использовании базы данных АссоппС1пд, внесем в таблицу СРБСовегя изменение, позволяющее проверять допустимость даты в поле РаСе1пЯузгев (это — поле системной даты, в котором не может находиться значение будущей даты): АЬТЕН ТАВЬЕ Спзповегз АРР СОНБТЕАТНТ СН С С Рагетпзупгев СНЕСК (Рапе1пБуппев <= СЕТРАТЕ ()) Теперь попытаемся выполнить вставку строки со значением, нарушающим ограничение СНЕСК; эта попытка доллгна привести к возникновению ошибки: 1НЯЕНТ 1НТО Сппговегз (Спвговегнап1е, Ае(г(гевз1, Ае)пгезз2, Сггу, Бгате, 21р, Соптасп, рпопе, Гег(гоно, Рзпетпзузпев) ЧАЬРЕЯ ('Спвгпвегт', 'Ае)п' езп1', 'Апп2', 'МуСТСу', 'Но Сопгасп', '553-1212', '930984954', '12-31-2049') Мпч 547, Ьече1 16, ЯСаге О, Ьтпе 1 Тпе 1НЯЕЕТ згагевепг соп111сСес)нгСЬ Спе СНЕСК сопзгга1пг "СН СппговегРаге1пзузгев".