С.Д. Кузнецов - Основы баз данных (1121716), страница 84
Текст из файла (страница 84)
В этот момент контекст сья~ будет «упрятан в стек», образуется и станет активным контекст следуюшего триггера — контекст пд1. После завершения выполнения этого триггера контекст пк1 больше не требуется, и он ликвидируется, а из стека восстанавливается контекст сььч, в котором и будет завершено выполнение триггера снглсв ьячс ио. Контекст выполнения триггера служит для того, чтобы обеспечить СУБД данными, необходимыми для корректного выполнения инициируемого оператора Б()(.. Эти данные представляют собой набор изменений состояния, где каждое изменение состояния описывает изменение данных в целевой таблице триггера.
Изменение состояния включает следующие данные: ° триггерное событие — 1НЗРР-., ПРПдтя или ПРЬВ-.Р; ° имя предметной таблицы триггера; ° имена столбцов предметной таблицы, специфицированных в определении триггера (только для триггеров по ЦРПЛР В); ° набор переходов (представление всех строк, вставляемых в предметную таблицу, модифицируемых в ней или удаляемых из нее), список всех григ~еров уровня к".ЛРРмкн=, уже выполненных в некотором (не обязательно активном) контексте выполнения, и список всех триггеров уровня пои, уже выполненных в некотором (не обязательно активном) контексте выполнения, и строк, над которыми зти триггеры выполнялись. Отслеживание уже выполненных триггеров ведется для предотврашения многократного выполнения одного и того же триггера в результате возникновения одного события, что могло бы потенциально привести к зацикливанию выполнения системы триггеров.
При создании контекста выполнения триггера его набор изменений состояния изначально пуст. В набор изменений состояния добавляется каждое встречающееся «новое» изменение состояния, в котором не дублируются триггерное событие сушествуюшего изменения состояния, имя предметной таблицы и имена столбцов предметной таблицы.
Набор переходов каждого изменения состояния изначально пуст, и переходы добавляются при каждом обновлении предметной таблицы, ассоциированной с изменением состояния (включая обновления, производимые ссылочными действиями). 405 Основы баз данных Курс Возисжности исаользоааниа старых и новых значений Мы уже продемонстрировали использование старых и новых значений в определении триггера Рерт совеесттох 1. Поскольку эта возможность является важной особенностью языка 59[., обсудим ее более подробно. Сначала немного поговорим о синтаксисе. Итак, в определении триггера может присутствовать раздел еееееехо1ХО о1г] ог пех уа1иеа а1(аа 11ас, причем список определений псевдонимов может включать следующие элементы: ОЬР [ ЕОХ ] [ АЯ ] согге1аг)оп пате ХЕХ [ ЕОХ ] [ АЯ ] согге1ас)оп пате ОЬР ТАВРЕ [ АЯ ] 1г[епг111ег ХЕХ ТАВОТЕ [ АЯ ] 1г[епе111ег Каждая из этих конструкций может входить в список определений псевдонимов не более одного раза, и спецификации ОРР еох и хех вох могут присутствовать только в определении триггеров уровня Вох.
Определяемые корреляционные имена и псевдонимы можно использовать внутри триггера для ссылок на значения предметной таблицы. Если определяется корреляционное имя для новых значений (хех Вох) или псевдоним для нового содержимого таблицы (мех ТАВРВ), то эти имена можно использовать для ссылок на значения, которые будут существовать в предметной таблице после выполнения операций 1ХЯЕЕТ или ОРРАТЕ. Если же определяется корреляционное имя для старых значений (ОРР еох) или псевдоним для старого содержимого таблицы (ОРР ТАВРВ)„то данные имена можно использовать для ссылок на значения, которые существовали в предметной таблице до выполнения операций ОВРАте или Ревете.
Конечно, нельзя использовать хех еох или хех тАВРВ в триггерах Ревете, поскольку никакие новые значения не создаются. Аналогично, нельзя использовать ОРР ВОХ или ОРР ТАВРЕ в триггерах 1ХЯЕЕТ, поскольку никакие старые значения не существовали. Таблицы, на которые указывают корреляционные имена или псевдонимы, называются переходными. Эти таблицы не сохраняются в базе данных долговременно; они создаются и уничтожаются динамически, по мере надобности в контексте выполнения триггера.
В триггерах уровня ЕОХ можно использовать корреляционное имя, определенное в конструкции ОРР ВОХ, для ссылки на значения строки, удаляемой или модифицируемой инициирующим оператором, в том виде, в котором данная строка существовала в предметной таблице до того, как была удалена или модифицирована при выполнении инициируюшего опера- 406 Язык баз данных ЕОЬ. средства манипулирования данными Лекция 17 тора. В триггерах этого уровня можно также использовать псевдоним, определенный в конструкции ОЬО ТАВЬЕ, для ссылкИ На ЛЮбое значение переходной таблицы в том виде, в котором она находилась до удаления или модификации очередной строки при выполнении инициируюшего оператора.
Аналогично обстоят дела с использованием корреляционных имен и псевдонимов, определенных в конструкциях НЕХ КОХИ ЫЕХ ТАВЬЕ. Для триггеров категории вееОке имеется существенное ограничение; в них не разрешается использовать конструкции ОЬВ ТАВ' Е и НЕХ тАВье, а внутритриггерный Я)Ь-оператор не может производить какие-либо изменения в базе данных. Основанием для такого ограничения является то, что на переходные таблицы, порождаемые Оьц тлвье и Мен тАВье, могут существенно влиять ссылочные действия, которые активизируются в результате изменений базы данных прн выполнении внутритриггерного Я)Ь-оператора. Поэтому значения строк в таких таблицах могут оказаться нестабильными и недостаточно предсказуемыми, если триггер срабатывает раньше действия триггерного оператора 801- Обработка нескольких триггеров, связанных с одной предметной таблицей В Б Н:1999 не запрещается определение нескольких триггеров, ассоциированных с одной предметной таблицей, относящихся к одной и той же категории (ВееОке или Аетек) и срабатывающих по одному и тому же событию.
Понятно, что при возникновении условия срабатывания всех таких триггеров система должна выбрать порядок, в котором они будут выполняться. Решение, принятое в ВОЬ, является предельно простым, хотя и несколько странным. При определении каждого триггера фиксируется временная метка выполнения оператора ОкеАТЕ Тктааек, и все триггеры, ассоциированные с одной предметной таблицей, относящиеся к одной и той же категории (Вее оке или Аетек) и срабатывающие по одному и тому же событию, упорядочиваются в соответствии со своими временными метками.
Тогда при возникновении условия срабатывания всех триггеров одной группы сначала выполняется первый триггер, затем второй и т. д. В стандарте не специфицируется точность временной метки, связываемой с триггером, и если в одной группе обнаруживаются два или более триггеров с неразличимыми временными метками, то порядок их выполнения должен определяться в реализации. Подход к установлению порядка выполнения триггеров в соответствии с их временными метками может вызвать чисто практические трудности у пользователей 50Ь-ориентированных СУБД. Например, если в Основы баз данных Курс ходе разработки приложения выяснится потребность в определении нового триггера, который должен выполняться раньше некоторого существующего триггера той же группы, то стандарт не может предложить ничего лучшего, кроме как уничтожить определения всех триггеров этой группы, а затем заново определить их в нужном порядке.
И еше одно интересное свойство триггеров в Я.)Е:1999. Как уже говорилось ранее в этом разделе, каждый инициируемый Б(~Е-оператор должен являться атомарным, т. е. если его выполнение завершается неуспешно, то в базе данных не должно остаться никаких следов подобного выполнения. Но в стандарте говорится больше: неуспешное выполнение хотя бы одного триггера из группы с одинаковым условием срабатывания должно приводить к отмене результатов выполнения инициируемых БО)-операторов всех триггеров этой группы, а также к отмене результатов выполнения самого инициируюшего Я))-операторач. Триггеры и ссылочные действия В разделе вВведение> лекции 12 мы достаточно подробно обсуждали механизм определения ссылочных действий, служащий для автоматической поддержки ссылочной целостности.
Напомним, что ссылочные действия автоматически модифицируют значения внешнего ключа соответствующей таблицы при удалении или модификации строк таблицы, на которую указывают ссылки. Конечно, ссылочные действия весьма напоминают триггеры, и в некоторых БО).-ориентированных СУБД они реализуются на основе общего механизма триггеров. Разработчики стандарта БО)л!999 считают этот подход неудачным, поскольку процедурная природа триггеров входит в противоречие с тщательно разработанной декларативной основой ссылочных ограничений целостности. Другими словами, спецификация ссылочной целостности, содержащаяся в стандарте, препятствует возможности встраивания в триггер упрощенного процедурного кода.
Однако даже в тех СУБД, где не смешиваются механизмы ссылочных действий и триггеров, неминуемо возникает взаимосвязь между ссылочными действиями, изменяющими некоторую таблицу, и триггерами, которые определены в этой таблице или также изменяют ее. В Я2ь:1999 эта взаимосвязь немного упрощается за счет того, что контроль всех ограничений целостности 1включая ссылочные ограничения) и выполнение всех ссылочных действий должны производиться до срабатывания триггеров категории лгтяд. Если выполняется некоторая операция обновле- " Помимо прочего, этот факт означает, что определение в базе ленных нового триггера может принести к нерабоюспособности сушестнугоюих приложении, разработчики которых, вообгле говоря, могут даже и не знать о ноя нленин нового триггера.
Лекция !7 Язык бвз данных 80Ы средства манипулирования данными ния таблицы т, то после ее выполнения и срабатывания всех ссылочных действий инициируются все триггеры, ассоциированные с таблицей т и видом произведенной операции, а также соответствующие триггеры, ассоциированные с любой таблицей, которая затрагивалась ссылочным действием, если в этой таблице была изменена хотя бы одна строка. Конечно, срабатывание триггера может привести к новым ссылочным действиям, которые повлекут за собой срабатывание других триггеров и т, д.* В заключение этого раздела, посвященного механизму триггеров, заметим, что многие спецификации стандарта ЯО1:1999 выглядят недостаточно убедительными. По всей видимости, полезные на практике триггеры слишком сложны с точки зрения теории.