С.Д. Кузнецов - Основы баз данных (1121716), страница 83
Текст из файла (страница 83)
Разработчики стандарта сочли, что область применения триггеров такого рода чересчур узка (трудно придумать какое-либо применение, кроме как для журнализации и аудита). Лвкцня !7 Язык баэ данных ВОЫ средства манипулирования данными Триггеры долги ЕРАТеием7 Если в определении триггера присугствует конструкция Рок кдсн кох, то триггер будет вызываться для каждой строки предметной таблицы, обновляемой инициируюшим ВОЕ-оператором, Если же задано Рок кдсн ктйткмкнт (или явная спецификация Рок клен отсутствует), то триггер сработает один раз на всем протяжении процесса выполнения инициируюшего $0) -оператора. Реедел инее Включение в определение триггера раздела хнкн с соответствуюшим условным выражением позволяет более точно специфицировать условие применимости триггера.
Вычисление условного выражения производится над строками предметной таблицы„и триггер срабатывает только в том случае, когда значением условного выражения является и"ие. Понятно, что виды и интерпретация логических выражений, допускаемых в разделе хнкн, различаются у триггеров с РОК КАСН КОХИ у триггеров с РОк КДСн ВтлткМКНт. Впервом случае условное выражение вычисляется для одной строки, которая должна быть обновлена инициируюшим В Н)=оператором. Во втором — усдовное выражение вычисляется дпя всей предметной таблицы целиком и, по всей видимости, должно базироваться на чкванторных» предикатах. Следует также понимать, что вычисление условия раздела хнкн данного триггера производится только в том случае, если произошло событие срабатывания триггера.
Тело триггера Операции, которые должны быть выполнены при срабатывании триггера, специфицируются в синтаксической конструкции гтзддетес) БОь агагевзепс (будем называть ее инициируемым 50х.-опе/гад!ором). Как видно из синтаксических правил, возможны два вида построения этой конструкции: в виде одиночного оператора Я~1 и в виде списка операторов со скобками вкати Атомгс и кх(). Недоумение читателей может вызвать неуточненная конструкция э0ь ртосес)с ге асасевзепс. Постараемся объяснить ее происхождение и смысл. Дело в том, что в стандарте ЗОЕП999 определено процедурное расширение ВО), называемое ЯИ./РБМ (от Регугугепг огогее/ Мог/и/еу).
Это достаточно большой язык, который мы не будем подробно рассматривать в этом курсе лекций*. Тем не менее для понимания синтаксиса оп- ' Для читателей, которые имеют котя бы минимальный опыт работы с продуктами компании Огас)е, заметим, что во многих своих чертах бОь/РБМ напоминает Р!./5ОЦ Одной из причин, на основании которых мы отказались от описания БОь/РЗМ в этой книге, является то, что до сих пор (первый вариант стандарта БОь/РБМ был опубликован в!996 г) нет ни одной реализапии Я.П., в которой этот стандарт был бы реалиюаан полностью (точнее, ни одна такая реалиэапия не известна автору). 401 Основы баз данных Курс ределения триггеров необходимо отметить, что: (а) ВО(./РВМ включает основные операторы Я.>Е, связанные с обновлением данных; (Ь) язык является вычислительно полным, т.
е. включает развитые средства вычислении; (с) в языке содержатся средства определения и вызова функций и процедур„* и (г)) Я ) Ь/РВМ содержит стандартный комплект управляющих конструкций — циклы, ветвления разных типов и т. д. Тем самым, ЯОь ргосеоцге зйа'ещепг — это любая процедура„определенная на языке БОЬ/РБМ.** В частности, эта процедура может представлять собой оператор ВОЕ обновления базы данных. Обсудим теперьч откуда возникает потребность в составном инициируемом ВО( -операторе. Дело в том, что на практике при определении триггеров в качестве БОь ргосес)цге вгасещепг чаще всего используются операторы БОЬ обновления базы данных. Иногда (и мы покажем это на примере) для корректного определения функциональности триггера одного оператора не хватает, а в ЯОЬ отсутствует возможность определения составных операторов.
Поэтому допускается использование средств определения составных операторов, присутствующих в ЯОЬ/РЯМ (ВЕО1Н АТОМ1С и ЕНР). Для иллюстрации случая, когда при определении триггера достаточно специфицировать один оператор БОЬ, приведем пример определения триггера, условием срабатывания которого является выполнение операции вставки новой строки в таблицу емр (прием на работу нового служащего). Если значение столбца Берт но в очередной вставляемой строке отлично от НОЬЬ, то триггер должным образом модифицирует значения столбцов ЬЕРТ ЕМР НО и ОЕРТ тстав, ЯАЬ строки таблицы БЕРТ со Значением столбца Оерт МО, которое соответствует номеру отдела нового сотрудника (пример 17.10): СНЕАТЕ ТН1СОЕН РЕРТ СОННЕСТ1ОН АГТЕН 1НЯЕНТ ОН ЕМР РОН ЕАСН НОХ ХНЕН (ЕМР.БЕРТ НО 1Я НОТ НОЬЬ) ОРОАТЕ ОЕРТ ЯЕТ РЕРТ ЕМР НО = ОЕРТ ЕМР НО + 1, БЕРТ ТОТАЬ ЯАЬ = ОЕРТ ТОТАЬ ЯАЬ + ЕМР ЯАЬ ХНЕНЕ РЕРТ.РЕРТ НО = ЕМР.РЕРТ НО; * Во многом на этих возмолгностях основываются механизмы БОЬ:!999, предназначенные для определения на уровне пояьзователя новых типов данных и их операций.
Эта тематика такие выходит за пределы данного курса (хотя мы немного затронем соответствующие вопросы в последней лекции этого курса). '" На самом леле, для написания процедур, функций и методов допускается использование не только языка ЯОЬ/РБМ, но и традиционных языков программирования, для которых в стандарте определены правила связывания с Я() Ь. В последней лекции курса мы немного затронем и эту тему. Лекция 17 Язык бвз данных ЯОЬ; средства манипулирования данными Теперь предположим, что при увольнении служащего (удалении строки из таблицы ечр) мы хотим не только должным образом модифицировать таблицу ОЕРТ, но и сохранять (с целью аудита) данные об уволенном служащем в таблице емр ЕТЯм155ец'.
ЕМР О15М155ЕОз Определение соответствующего триггера могло бы выглядеть следующим образом (пример 17,11): СЕЕАТР ТП1ОСпп ЕМР О»ЯМ 551ОЧ АРТ»К ОЕЬптп СИ ЕУР РОЕ ЕАСН ДОХ ВЕС1М АТОМТС 1ЧТО ЕМР Р»ЯЧ ЯЯЕР ЕОХ (ЕМР.ЕМР МО, ЕМР.ЕМР МАМЕ, ЕМР.ОЕРТ ИО~ ОРОАТЕ ОЕРТ ЯЕТ ОЕРТ ЕМР МО = ОЕРТ ЕМР ИΠ— 1, РЕРТ ТОТАЬ ЯАЬ = ОЕРТ ТОТАЬ ЯАЬ - ЕМР ЯАЬ ХНЕКЕ ЭЕРТ.ВЕЕТ МО = ЕМР.ОЕРТ МО Енрп Выполнение триггеров При выполнении каждого триггера система устанавливает контекст выполнения триггера.
Выполнение любого оператора ЯЩ., обновляющего базовую таблицу базы данных, может привести к срабатыванию одного или нескольких триггеров, а выполнение операторов Я3(, содержащихся в триггерах, может привести к обновлению других базовых таблиц. Эти «внутритриггерные» (инициируемые) операторы выполняются в контексте текущего триггера, но их выполнение может привести к срабатыванию других триггеров. Для каждого из «вторичных» триггеров образуется собственный контекст выполнения, позволяющий определить их действия точно и независимо от действий первого набора триггеров. Выполнение вторичных триггеров может привести к срабатыванию «третичных» триггеров и т.
д. — допускается произвольная глубина вложенности. Для каждого триггера на каждом уровне образуется собственный контекст. * для упрощения будем считать, что идентификаторы уволенных служащих не используются повторно. 403 Основы баа данных Курс Контекст выполнения триггера всегда является атомарным, т, е. инициируемый ЕО1.-оператор либо успешно завершается, либо результаты его действия гарантированно отсутствуют в базе данных. Обсудим понятие контекста триггера немного более подробно. Предположим, что в нашей базе данных емР-РВРт-РВО должно поддерживаться правило, в соответствии с которым каждый служащий, становящийся руководителем проекта, автоматически получает прибавку к заработной плате в 10 000 руб.
(Для простоты будем считать, что снятие служащего с должности руководителя проекта не приводит к автоматическому изменению его зарплаты и что для каждого служащего, являющегося руководителем проекта, определен номер отдела, в котором он работает.) Тогда мы могли бы определить триггер СНАМОЕ ММО МО следующим образом: СВЕАТЕ ТВТООЕВ СНАМОЕ МИО ИО АГТЕВ ОРОАТЕ ОР РВО М14О ОМ РВО РОВ ЕАСН ВОХ ОРОАТЕ ЕМР ЯЕТ ЕМР ЯА =- ЕМР ЯА г 10000.00 ХНЕВЕ ЕМР ИО = РВО МИО; Но очевидно, что для поддержания корректности данных в таблице ОЕРТ нам требуется триггер, условием срабатывания которого было бы изменение значений столбца емР ЯАЬ в таблице ЕМР. Определим соответствУющий тРиггеР РЕРТ СОВВЕСТ1ОИ 1; СВЕАТЕ ТВ1СЯЕВ РЕРТ СОВВЕСТТОН 1 АРТЕВ ОРОАТЕ ОР ЕМР ЯА.
ОИ ЕМР ВЕРЕВЕИС1КЯ О 0 ВОХ АЯ ОЕО ЕМР МЕХ ВОХ АЯ МЕХ ЕМР РОВ РАСН ВОХ ОРОАТЕ РЕРТ ЯЕТ РЕРТ ТОТА1 ЯА.. = РЕРТ ТОТА! ЯА! э МЕХ ЕМР.ЕМР ЯАЬ вЂ” О'Р ЕМР.ЕМР ЯА1 ХНЕВЕ ЕМР РЕРТ ИО = РЕРТ РЕРТ ИО. Пусть теперь выполняется операция УРРАТЕ РВО ЯЕТ РВО ММО = 4455 ХНЕВЕ РВО ИО = 554; Сразу после выполнения этой операции сработает триггер СНАХОЕ Мна МО. Этот триггер будет выполняться в контексте, который мы для удобства назовем контекстом Сии Заметим, что исходный оператор модификации в действительности изменяет только одну строку таблицы РВО, но триггеру СЕМИН ММО НО это неизвестно, и он будет Лекция г7 Язык баз данных ЬОЦ средства манипулирования данными работать так, как если бы изменялось произвольное число строк табЛнпы РРО. Выполнение операции модификации таблицы РМР приведет к срабатыванию триггера пРРт СОЯРЕСт1ОИ 1.