|
Программирование >> Руководство по sql
Каскадировать - операция удаления или модификации автоматически применяется к внешним ключам, значения которых соответствовали старому значению удаленного или модифицированного первичного ключа. Обнулить - до выполнения операции удаления или модификации в отношении первичного ключа значения (значение) соответствующих внешних ключей (ключа) устанавливаются в NULL. К сожалению, многие диалекты SQL не предусматривают механизмов управления ссылочной целостностью первичных ключей. В этих случаях максимум, что вы можете сделать для обеспечения ссылочной целостности, - это аннулировать все разрешения на удаление и обновление столбца первичных ключей. Однако по мере все более широкого признания важности понятия ссылочная целостность разработчики пытаются обеспечивать ее путем ввода специальных процедур или триггеров. В качестве одного из примеров можно назвать Transact-SQL. Изложение подробностей триггерного механизма, предусмотренного в Transact-SQL, не входит в задачи настоящей книги, но описание, приведенное в следующем разделе, даст вам некоторое представление о возможности использования триггеров для обеспечения ссылочной целостности. Триггеры. Триггер в Transact-SQL представляет собой именованную совокупность операторов SQL, описывающую действие, которое необходимо выполнить при попытке выполнения указанной операции модификации данных в отношении определенного столбца или таблицы. Триггеры действуют автоматически. Они работают независимо от того, что именно является причиной модификации данных, - ввод данных, выполненный человеком-оператором, действие той или иной прикладной профаммы или получение отчета. Каждый триггер предназначен для одной или нескольких операций модификации данных: UPDATE, INSERT или DELETE. Создание триггера включает указание команды модификации данных, которая запускает этот триггер, таблицы, которая является его целью , и действия (или действий), которое должен выполнить триггер. Ниже приведен синтаксис оператора CREATE TRIGGER: CREATE TRIGGER имя триггера ON имя таблицы FOR {INSERT I UPDATE DELETE} [, {INSERT I UPDATE DELETE}]... AS SQL onepaTop [IF UPDATE (имя столбца) [{AND I OR} UPDATE (имя столбца)]...] Предложение ON задает имя таблицы, которая активизирует этот триггер (так называемая триггерная таблица). Предложение FOR указывает, какая команда (команды) модификации данных активирует триггер. Операторы SQL в предложении AS определяют триггерные действия и триггерные условия. Триггерные действия могут вю1ючать любое количество операторов SELECT. Триггерные условия могут указывать дополнительные критерии, которые определяют, приведут ли к выполнению триггерного действия (действий) попытки выполнения команд INSERT, DELETE или UPDATE. Триггерные условия часто включают подзапрос, которому предшествует ключевое слово IF. Предложение IF UPDATE (имя столбца) проверяет, был ли модифицирован указанный столбец; при этом триггерные действия ассоциируются с выполнением изменений в конкретных столбцах. В операторах CREATE TRIGGER используются имена двух логических (или концептуальных) таблиц - deleted и inserted. Когда на ту или иную фиггерную таблицу выдается команда DELETE (например, делается попытка удалить значения первичных ключей), удаляемые строки изымаются из триггерной таблицы и переносятся в таблицу deleted. Затем триггер может проанализировать строки в таблице deleted, чтобы определить, должны ли (а если должны, то как) выполняться соответствующие фиггерные действия (действие). Когда делается попытка выполнения команды INSERT или UPDATE, строки, представляющие новые значения, одновременно добавляются в триггерную таблицу и в таблицу inserted. Строки в таблице inserted могут быть затем проанализированы триггерным механизмом. Ниже приведен пример триггера, который выполняет каскадирование, когда удаляется значение первичного ключа в таблице titles. Когда в отнощении таблицы titles выполняется оператор DELETE, триггер удаляет соответствующую строку из таблицы titles и добавляет ее в таблицу deleted. Затем он проверяет таблицы titleauthors, salesdetails и roysched, выясняя, нет ли в них строк с внешним ключом titleid, который соответствует значению titleid, удаленному из таблицы titles (теперь это значение хранится в таблице deleted). Если триггер обнаружит подобные строки, то удалит их. SQL (расширение): create trigger delcascadetrig on titles for delete delete titleauthors from titleauthors, deleted where titleauthors.title id = deleted.title id /* Удаление строк из таблицы titleauthors, соответствующих удаленным строкам из таблицы titles */ delete salesdetails from salesdetails, deleted where salesdetails.title id = deleted.title id /* Удаление строк из таблицы salesdetails, соответствующих удаленным строкам из таблицы titles */ delete roysched from roysched, deleted where roysched.title id = deleted.title id /* Удаление строк из таблицы roysches, соответствующих удаленным строкам из таблицы titles */ Ниже приведен еще один пример триггера контролирующего ссылочную целостность: он предотвращает модификации столбца первичных ключей таблицы titles в определенные дни недели. (Такой триггер может понадобиться для любого типа столбца, а не только для столбца первичных ключей.) Предложение IF UPDATE фокусирует этот триггер на определенном столбце - titles.titlejd. Попытки модификации этого столбца заставляют триггер переходить к действиям, отменяя операцию модификации и распечатывая соответствующее сообщение. SQL (расширение): create trigger stopupdatetring on titles for update if update (title id) and datename (dw, getdate ()) in ( Saturday , Sunday ) begin rollback transaction print B выходные изменять значения первичного ключа запрещено! end /* Если titles.title id изменяется в субботу или в воскресенье, то предотвратить его обновление*/ Как только что было показано, триггеры Transact-SQL часто используются для контроля ссылочной целостности, которой уфожает выполнение операций модификации и удаления первичного ключа. Однако, в сущности, триггеры представляют собой более обобщенный метод рещения проблем целостности. Триггеры могут налагать ограничения, более сложные, чем ограничения, определяемые правилами, СНЕСК-офаничениями или REFERENCES-ограничениями. Триггер, например, может отвергать операции модификации, связанные с увеличением цены книги более чем на 1 процент от авансового гонорара за нее, или препятствовать любым повыщениям цены более чем на 100 процентов. Триггеры можно использовать для пересчета текущих значений. Например, у вас может быть триггер, который обновляет столбец ytd sales в таблице titles всякий раз, когда в таблицу ia/esJeto добавляется новая сфока. ОТ АБСТРАКЦИЙ SQL К РЕАЛЬНОМУ МИРУ Эта глава приблизила обсуждение SQL к понятиям реального мира, зафонув такие темы, как производительность, управление фанзакциями и средства обеспечения ссылочной целостности. Мы не будем вдаваться в подробное обсуждение этих вопросов, поскольку системы управления реляционными базами данных весьма существенно отличаются друг от друга тем, как в них реализованы средства получения резервных копий и восстановления, управление транзакциями и сфа-тегии доступа, В следующих двух главах мы вернемся ко многим из тех операторов SQL, с которыми вы уже знакомы, представив более сложные фрагменты кода.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.004
При копировании материалов приветствуются ссылки. |