Введение в системы БД (542480), страница 78
Текст из файла (страница 78)
По крайней мере (как уже отмечалось выше), когда лля реализации ссылочных действий потребуется использовать некоторые процедуры, это должно указываться декларативно. 8.9. Средства языка Я;Н, Классификация ограничений целостности в языке Щ. довольно сильно отличается от схемы, описанной в разделах 8.1 — 8.5. В языке ЯО1. все ограничения делятся на три категории: ° отграничения домена; ° ограничения базовой таблицы; ° общие ограничения (иначе называемые утвержденилии). Однако ограничения домена — это не то же самое, что обсуждавшиеся выше ограничения типа, а ограничения базовой таблицы отличаются от обсуждавшихся здесь ограничений переменной-отношения.
Аналогично утверждения отличаются от понятия ограничений базы данных. Укажем некоторые особенности, касающиеся упомянутых понятий языка ЯЯ.. ° В действительности в языке Я,)1. вовсе нет ограничений типа (поскольку язык 8О1. не поддерживает никаких типов, за исключением небольшого количества встроенных типов). ° Понятие ограничения домена в языке БО). представляет некоторую сомнительную обобщенную форму нашего ограничения атрибута (напомним, что домены в стиле языка ЕО1. в реляционном смысле доменами не являются). ° Ограничения базовой таблицы и утверждения языка Я;)1 (которые фактически взаимозаменяемы) упрощенно можно считать равносильными нашим ограничениям переменной-опюшения и базы данных, вместе взятым.
Также отметим, что в языке ЕО1. совершенно отсутствует поддержка ограничений перехола. В настоящее время не полдерживаются и триггерные процедуры, хотя их поддержка уже включена в новый стандарт Я)1.3 (см, приложение Б). 322 Чаег~ь 11 Реляционная модель Ограничения домена В языке Я()Ь ограничения домена представляют собой ограничения, применяемые к каждому столбцу, объявленному принадлежащим к данному домену. Приведем пример определения домена. СКЕАТЕ ООИАХН СОЬОК СНАК(б) ОЕРАО?Т '???' СОИБТКА1НТ ЧАВ?0 СОЬОКБ СНЕСК ( ЧАЬНЕ 1Н ( 'Кеб', '?е11ои', 'В1це', 'Огееп', '???' ) ] Предположим, что оператор СКЕАТЕ ТАВЬЕ для базовой таблицы Р (таблицы деталей) выглядит следующим образом. СКЕАТЕ ТАВЬЕ Р ( ..., СОЬОК СОЬОК, ...
) Если пользователь вставляет в таблицу Р только часть новой строки, не содержащую значение для столбца СОЬОК, то по умолчанию в этот столбец будет помещено значение '???'. Если же пользователь укажеш значение для столбца СОЬОК, но это значение не будет принадлежать диапазону допустимых для него значений, то операция не будет выполнена и система выдаст сообщение, в котором будет указано о нарушении пользователем ограничения ЧАЬ10 СОЬОКБ.
Как было показано в разделе 8.2, концептуально ограничения домена являются (или, скорее, должны являться) ничем иным, как перечнем значений, которые составляют этот домен, и приведенный выше пример ограничения ЧАЬ10 СО1 ОКЕ, конечно, следует этому определению.
Однако в общем случае язык ЯО). позволяет включать в определение ограничений доменов логические выражения произвольной сяожмостм. Это предоставляет возможность указывать, например, что допустимые значения некоторого домена 0 могут зависеть от значений указанного атрибута, присутствующих в настоящий момент в некоторой таблице Т. Читатель может поразмышлять о возможных последствиях такой неоправданной вседозволенности. Ограничения базовой таблицы В языке Я >Ь существуют следующие виды ограничений базовой таблицы: ° определение потенциального ключа; ° определение внешнего ключа; ° определение "проверочного условия".
Ниже каждое из них обсуждается подробнее. Замечание. В языке ЯОЬ каждому определению ограничений может предшествовать предложение вида СОНБТКА1ИТ <лмя огранлченляэ, задающее имя нового оЧэаничения (это замечание верно и для ограничений доменов, как мы уже убедились на примере ограничения ЧАЬ10 СОЬОКБ). В приводимых ниже примерах мы будем игнорировазь эту возможнос~ь. Лотеициальные ключи Определение потенциального ключа записывается в следующем виде.
ОН1()ОЕ ( <сплсок имен столбцов> ) 323 Глава 8. Целостность данньп Возможна и другая форма записи. РН1НАНТ КЕТ ( <список имен столбцов> ) В обоих случаях параметр <список имен столбцов> не должен быть пустым. Для заданной базовой таблицы может существовать не более одной спецификации РН1НАНТ КЕТ (первичный ключ) и любое количество спецификаций ОН100Е (альгернативные ключи). В случае первичного ключа для каждого из указанных столбцов дополнительно подразумевается наличие в определении спецификации НОТ НОЬЬ, даже если эта спецификация не была указана явно. Проверка выполнения ограничений будет обсуждаться ниже. Внешние ключи Определение внешнего ключа записывается следующим образом. РОНЕ1ОН КЕТ ( <список имен столбцов> ) НЕРЕНЕНСЕЯ <имя базовой таблицы> [ ( <списох имен столбцов> ) [ ОН ОЕЬЕТЕ <ссыпанная операция> ] [ ОН ОРОАТЕ <ссыпанная операция> ] Здесь параметр <ссмлочная операция> может принимать значения НО АСТ10Н (по умолчанию), САБСАОЕ, БЕТ ОЕРАОЬТ и БЕТ НОЬЬ.
Опции БЕТ ОЕРАВЬТ и ЯЕТ НОЬЬ будут рассматриваться в главе )8. Второй параметр <списох имен столбцов> необходим в том случае, если внешний ключ ссылается на потенциальный ключ, который не является первичным ключом. Замечание. Соответствие "внешний ключ — потенциальный ключ" устанавливается не на основе имен столбцов, а на основе позиции (слева направо) в списках имен атрибутов. Проверочные условия Определение проверочного условия (проверочного ограничения) имеет следующий вид.
СНЕСК ( <усповное выражение> ) Попьнка создания строки т в базовой таблице Т рассматривае~ся как нарушение проверочного ограничения лля таблицы Т, если в результате вычисления указанного в этом ограничении условного выражения для строки г будет получено значение ложь. Замечание. Условное выражение в языке Я >Е является аналогом того, что ранее мы называли логическим (или булевым) выражением. Эти выражения подробно рассматриваются в приложении А. В час~ности, отметим, что в данном контексте условное выражение может быть сколь угодно сложным. Не требуется, чтобы условие ограничения включало ссылки только на таблицу Т; оно может иметь ссылки на что угодно в базе данных.
Читателю, опять-таки, будет полезно поразмышлять над тем, какими могут быть последствия такой неоправданной вседозволенности. Вот пример создания таблицы с помощью оператора СЙЕАТЕ ТАВЬЕ, в котором используются ограничения базовой таблицы всех трех типов. СНЕАТЕ ТАВЬЕ БР ( Б() Б() НОТ НОЬЬ, Р() Р$ НОТ НОЬЬ, ЦТТ ОТТ НОТ НОЬЬ, РН1МАНТ КЕТ ( Я(), Р]) ), РОНЕ16Н КЕТ ( Я]) ) НЕРЕНЕНСЕЯ Б 324 Часть 11.
Реляционная модель ОМ ОЕЬЕТЕ САЯСАОЕ ОМ НРОАТЕ САЯСАОЕ, ГОВЕ16М КЕТ ( Р() ) КЕРЕКЕМСЕЯ Р ОМ ОЕЬЕТЕ САЯСАОЕ ОМ ОРОАТЕ САБСАОЕ, СНЕСК ( ОТХ > 0 АМО ОТХ < 5001 ) ) Здесь подразумевается, что домены 8$. Р) и ОТХ уже определены, а атрибуты Б() и Р() явно определены как первичные ключи для таблиц Я и Р соответственно. Также здесь умышленно применяется соглашение по сокрашению, благодаря которому проверочное условие вида СНЕСК ( <имя столбца> 18 МОТ МНЬЬ ) в определении рассматриваемого столбца можно заменить простой спецификацией МОТ МНЬЬ.
В соответствии с данным правилом в этом примере три достаточно громоздких проверочных условия заменены тремя простейшими спецификациями МОТ МОЬЬ. Завершая подраздел, обратим внимание на некоторую "странность": считается, что ограничение базовой таблицы БОЬ всегда удовлетворено, если базовая таблица пуста, причем даже в случае ограничения вида "эта таблица не должна быть пустой"! Утверждения Рассмотрим третий случай: общие ограничения, иначе называемые утверждениями.
Общие ограничения создаются с помощью оператора СКЕАТЕ АЯЯЕКТ1ОМ, имеющего следующий синтаксис. СКЕАТЕ АЯБЕВТ1ОМ <имя ограничения> СНЕСК ( <услолиое выражение> ) Здесь параметр <имя ограничения> задает имя создаваемого ограничения, а параметр <условное вмраяеиие> определяет проверяемое условное выражение. Для отмены общего ограничения используется оператор 0КОР АЯЯЕКТ10М.
ОВОР АЯЯЕВТ1ОМ <имя ограиичеиия> ! Отметим, что в отличие от всех других форм ЯОЬ-оператора отмены ОВОР, приведенных в этой книге (ОКОР ООНА1М, ОКОР ТАВЬЕ, ОВОР Ч1ЕМ), оператор ОКОР АЯБЕВТ1ОМ не содержит опций КЕБТВ1СТ и САЯСАОЕ. Вот несколько примеров утверждений, создаваемых с помощью оператора СВЕАТЕ АББЕКТ1ОМ. !.
Каждый поставщик должен иметь статус не менее 5. СКЕАТЕ АЯБЕКТТОМ 1С13 СНЕСК ( ( БЕЬЕСТ М1М ( Я.ЯТАТНЯ ) РВОМ Я » 4 ) ! 2. Значение веса любой детали должно быть положительным. СКЕЙТЕ АЯЯЕКТ1ОМ 1С18 СНЕСК ( МОТ ЕХ1ЯТБ ( ЯЕЬЕСТ * РВОМ Р ИНЕКЕ МОТ ( РЛЕ16НТ > 0 ] ) ) 325 Глава 8. Целостность данньп 3. Все красные детали должны храниться в Лондоне. СКЕЙТЕ йЯЯЕКТ10И 1С99 СНЕСК ( ИОТ ЕХ1ЯТБ ( ЯЕЬЕСТ * ГНОМ Р ИНЕКЕ Р.СОЬОК = 'Кеб' ЙМР Р.СЬТХ <> 'Ьопбоп' ) ) 4. Не допускаются поставки с общим весом (произведение количества деталей и их веса), превышающим 20 000 фунтов. СКЕАТЕ йЯБЕКТ10И 1С46 СНЕСК ( ИОТ ЕХ1ЯТЯ ( ЯЕЬЕСТ + ГНОМ Р, ЯР ИНЕКЕ Р.Р$ = ЯР.Р$ АИР ( Р.ИЕ10НТ * БР.ЦТГ ) > 20000.0 ) ) 5. Поставщики со статусом, меньшим 20, не имеют права поставлять любую деталь в количестве более 500 штук.
СКЕЙТЕ АЯЯЕКТ10И 1С95 СНЕСК ( ИОТ ЕХ1ЯТБ ( ЯЕЬЕСТ " ГНОМ Я, ЯР ИНЕКЕ Я.ЯТАТРЯ < 20 ЙИР Я.Я$ = ЯР.Я$ АКР ЯР.ОТХ > 500 ) ) Откладываемая проверка Классификация ограничений целостности в языке Б()Ь отличается от нашей также в отношении вопроса, ко~да должна выполняться проверка. В нашей схеме ограничения базы данных проверяются во время выполнения оператора СОММ1Т, а остальные ограничения проверяются немедленно. В языке БОЬ подход иной и ограничении могут быть определены как откладываемые и неоткладываемые (опции РЕГЕККАВЬЕ и ИОТ РЕГЕККЙВЬЕ соответственно).
Если ограничение откладываемое, оно дополнительно может быть определено как исходно откладываемое (1И1Т1ЙЬЬХ РЕГЕККЕР) или исходно выполняемое (1И1Т1АЬЬГ 1ММЕ01йТЕ), что определяет состояние ограничения в начале выполнения каждой транзакции. Неоткладываемые ограничения всегда проверяются немедленно, а откладываемые могут динамически включаться и отключаться с помощью оператора, синтаксис которого приведен ниже.