Введение в системы БД (542480), страница 77
Текст из файла (страница 77)
Подробнее этот вопрос рассматривается в следующих подразделах. Ссылочные операции Рассмотрим следующий оператор. ОЕЬЕТЕ Я ЯНЕКЕ Я( = 8$ ( 'Б1' ) Предположим, что оператор ОЕЬЕТЕ выполняет именно те действия, которые и должен выполнять, т.е. удаляет кортеж описания поставщика с номером '81', и не более того. Также предположим, что база данных включает некоторые поставки для поставщика с номером 'Б1' (как показано на рис.
3.8) и выполняемое приложение не намеревается удалять сведения об этих поставках. Если впоследствии система проверит выполнение ограничений ссылочной целостности между переменными- отношениями поставщиков и поставок, то будет обнаружено их нарушение и выдано сообщение об ошибке. Замечание. Поскольку в этом случае ссылочное ограничение является ограничением базы данных, его проверка будет осуществляться во время выполнения оператора СОММ1Т, по крайней мере концептуально. (На самом деле система вполне может проверить соблюдение ограничений и сразу же после выполнения оператора ОЕЬЕТЕ, однако нарушение ограничения в этот момент необязательно означает ошибку, т.е. системе необходимо будет осуществить эту проверку еще раз, во время выполнения оператора СОММ1Т.) Однако существует и альтернативный подход, который в определенных случаях может оказаться предпочтительнее.
При этом подходе предполагается, что системой выполняются соответствующие компенсирующие операции, гарантирующие, что конечный результат будет удовлетворять существующим ограничениям. В нашем примере очевилной компенсирующей операцией могло бы быть "автоматическое" удаление сведений обо всех поставках поставщика с номером 'Я1'. Достичь этого можно, расширив определение внешнего ключа.
РАК БР ВАНЕ КЕ1АТТОН ( ГОКЕ16Н КЕУ ( БР ) КЕГЕКЕНСЕЯ Я ОН ОЕЬЕТЕ САЯСАОЕ 319 Глава 8. Целостность Данных Спецификация ОЫ ОЕЬЕТЕ САЯСАОЕ определяет правила удаления для данного конкретного ключа, которое будет применяться при обработке операторов ОЕЬЕТЕ. Здесь спецификация САЯСАОЕ определяет тип ссьиачнай операции для этого правила удаления. Смысл определений состоит в том, что обработка операторов 0ЕЬЕТЕ для переменной- отношения поставщиков должна сопровождаться "каскадным" удалением всех соответствующих кортежей из переменной-отношения поставок. Другая общепринятая ссылочная операция задается спецификатором ЕЕЯТЕТСТ (она не имеет ничего общего с операцией выборки (гемпсс) реляционной алгебры).
В данном случае спецификатор ЕЕЯТЕ1СТ указывает, что выполнение операции 0ЕЬЕТЕ допускается, если в переменной-отношении поставок нет ни одного кортежа с соответствующим внешним ключом. В противном случае операция удаления отвергается. Опускание конкретного спецнфикатора ссылочной операции при определении некоторого внешнего ключа равносильно заданию спецификатора ЕО АСТ1ОМ (никаких действий), означающего, что операция 0ЕЬЕТЕ будет выполняться в точности так, как она описана, и не более того.
(Если спецификатор МО АСТ1ОМ применить к нашему примеру, то при удалении поставщика, для которого имеются сведения о выполняемых им поставках, установленное ограничение ссылочной целостности, безусловно, будет нарушено.) Рассмотрим некоторые случаи применения ссылочных операций. 1. Операция 0ЕЬЕТŠ— это не единственная операция, для которой имеет смысл определение ссылочных операций. Например, что должно произойти при попытке изменить номер поставщика, для которого уже имеются сведения хотя бы об одной поставке? Очевидно, что необходимо использовать правило обновления, подобное обсуждавшемуся выше правилу удаления. В общем случае для операции обновления существует тот же набор ссылочных действий, что и для операции удаления. ° САЯСАОŠ— "каскадно" распространить операцию обновления посредством обновления значений всех соответствующих внешних ключей в переменной- отношении поставок. ° КЕЯТЕ1СТ вЂ” ограничить выполнение операции обновления только теми случаями, когда не существует никаких соответствующих поставок.
Иначе выполнение операции запрещаешься. ° КО АСТ1ОМ вЂ” операция обновления выполняется в точности так, как она записана. 2. Безусловно, спецификаторы САЯСАОЕ, КЕЯТЕ1СТ и МО АСТ1ОМ не следует считать единственно возможными вариантами ссылочных операций. Это минимальный набор спецификаторов, отражающий только те варианты лействий, которые чаще всего применяются на практике. Однако, а принципе, может существовать произвольное количество возможных решений прн попытке, например, удалить определенного поставщика. Укажем некоторые из возможных действий.
° Информация записывается в некоторую архивную базу данных. ° Поставки для одного поставщика передаются другому поставщику. И т.д. Однако невозможно предоставить декларативный синтаксис лля всех мыслимых решений. Поэтому в общем случае просто должна существовать возможность указать ссылочные действия в виде выражения САЬЬ ргас(... ), где ргос— имя процедуры, определяемой пользователем. З2О Часть 11. Реляционная модель Замечание. Выполнение этой процедуры должно рассматриваться как часть транзакции, для успешного завершения которой необходимо обязательно выполнить проверку целостности.
Кроме того, сохранение целостности базы данных должно быть проверено повторно, после выполнения самой этой процедуры (поскольку понятно, что данная процедура не должна переводить базу данных в состояние, противоречащее требованиям ограничений целостности). 3. Пусть К1 и К2 — ссылающаяся и ссылочная переменные-отношения соответственно. К2 — -э К1 И пусть для этого ссылочного ограничения установлено правило удаления СКБСйоЕ. Тогда удаление некоторого кортежа из переменной-отношения К1 в общем случае повлечет за собой удаление определенных кортежей переменной-отношения К2. Теперь предположим, что на переменную-отношение К2, в свою очередь, ссылается некоторая переменная-отношение К3.
КЗ вЂ” з К2 — ~ К1 То~да результат неявного удаления кортежей из переменной-отношения К2 по сути ничем не будет отличаться от попытки непосредственного удаления этих кортежей явно заданной операцией удаления. Иначе говоря, выполнение неявного удаления требует соблюдения правила удаления, установленного как ограничение ссылочной целостности между переменными-отношениями К3 и К2. Если в результате требуемое удаление выполнено не будет (согласно установленному правилу удаления для ссылочной зависимости между переменными-отношениями К3 и К2 или же по какой-либо другой причине), то должно быть отменено и выполнение всей операции в целом, а база данных сохранена в неизменном состоянии. И так далее рекурсивно для любого количества уровней.
Аналогичные замечания можно сделать в отношении правил каскадного обновления, потребовав распространения необходимых изменений, если внешний ключ в переменной-отношении К2 имеет какие-либо общие атрибуты с потенциальным ключом той переменной-отношения, на которую ссылается внешний ключ в переменной-отношении К3, 4. Из сказанного выше следует, что с логической точки зрения операции обновления базы данных всегда атомарны (все или ничего), даже в том случае, когда из-за установленного правила каскадного распространения изменений они неявно выполняют несколько обновлений в нескольких переменных-отношениях.
Триггерные процедуры В предыдущем подразделе в качестве одного нз возможных решений проблемы поддержки ссылочной целостности предлагалось применять пользовательские процедуры. У читателя, по-видимому, нет никаких сомнений в том, что в общем концепция ссылочных действий относится, скорее всего, не к ограничениям целостности как таковым, а к области п~риггериых нромедур.
Триггерные процедуры, ко~орые в литературе часто называют просто тригеераыи, автоматически вызываются, как только происходит некоторое событие (или условие запуска). Обычно условием запуска является выполнение некоторой операции обновления базы данных, но это может быть и определенная исключи- зл Глава 8. Целостность данных тельная ситуация (в частности, нарушение некоторого установленного ограничения целостности) или истечение заданного времени. Простейшим примером триггерной процедуры могут служить ссылочные действия, выполняемые при указании спецификатора САЯСАЭЕ (заметьте, при декларативном указании!). В общем случае триггерные процедуры могут применяться и для решения более широкого круга проблем, а не только для рассматриваемых в этом разделе вопросов обеспечения ссылочной целостности.
(С перечнем таких применений можно ознакомиться в 18.1).) Однако это большая самостоятельная тема, которая выходит далеко за рамки данной книги. (Заинтересованный читатель может обратиться к 18.22), где эти вопросы излагаются подробно.) Хотелось бы отметить, что, несмотря на то что использование триггерных процедур может быть чрезвычайно полезным для достижения самых различных целей, его не следует считать хорошим подходом для обеспечения целостности базы данных по очевидным причинам: декларативный подход, если он только возможен, всегда предпочтительнее. Замечание. Последнее высказывание не означает, что использование ссылочных операций — это плохая идея.