|
Программирование >> Реляционные базы данных
6.6 Триггеры в SQL3 Рассмотренные в этой главе различные формы ограничений удовлетворяют стандарту SQL2. Согласно модели нх выполнения, они применянэтся при изменении элемента, к которому относятся. Например, основанное на атрибуте ограничение CHECK используется при изменении этого атрибута в некотором кортеже (включая случай вставки кортежа). Поскольку реализация ограничений предполагает инициирование проверки при определенных событиях, кажется естественным поручить отбор таких событий програмлнюту БД. а не систе.ме. Такой подход дал бы пользователю допмнительные возможности запускать операции БД не только для предотвращения нарушений ограничений. Поэтому предлагаемый стандарт SQL3 содержит Триггеры, которые напоминают ограничения, \ю включают в себя явно определенные события и действия, предпринимаемые при определенных условиях. Интересно, что современные ко.ммерческне системы зачастую ближе к SQL3. че.м к SQL2. в плане трактовки активных элементов. Это южнo объяснить тем, что коммерческим поставщикам легче реализоиатъ триггеры, чем утверждения. следующими способами: *а) сдслаПте title и year ключом отноигения Movie; b) введите ограничение ссьшочной целостности, согласно которому продюсер каждого фильма входит в отношение MovieExec; c) потребуйте, чтобы продолжительность фильма была не менее 60 и не более 250 минут; ♦! d) потребуйте, чтобы ни одно имя не было именем и кинозвезды, н йдминистратора (это ограничение не нужно применять при удалениях); ! е) потребуйте, чтобы никакие две сгулт не имели одного и того же адреса. Упрожнение 6.5.2. Покажите, как изменить схемы БД ClaEses(class, type, country, numGuns. bore, displacement) Ships(name, class, launched) Battles(name, date) Outcomes(ship. battle, result) чтобы получить следующие основанные на кортеже ограничения: a) Class и country образуют ключ отношения Classes. b) Ограничение ссылочной цeJюcтнocти, согласно которому корабль, появляющийся в Battles, появляется н в Ships. c) Ограниче1Н1е ссылочной целостности, согласно которому корабль, появляющийся в Outcomes, появляется и в Ships. d) Ни один корабль не имеет более 14 орудий. ! с) Корабль не должен участвовать в битве до его спуска на воду. 6.6л Триггеры и ограничения Триггеры, иногда называемые правилами типа событие-услоеие-дейапеие, или правиломи ЕСА, отличаются от рассмотренных выше ограничений в трех аспектах: 1. Триггеры применяются только при наступлении конкретных событий, определенных программистом БД, обычно при вставке, удалении или изменении отдельного отношения. Во многих системах SQL таким событием считается также конец транзакции (атомарные единицы работы, называемые транзакциями, рассматриваются в разделе 7.2), 2. Вместо немедленного предотвращения вызвавшего его события триггер проверяет заданное условие. Если оно не выполняется, в ответ на событие не выполняется никаких действий, связанных с триггером. 3. Если условие триггера выполняется, связанное с ним действие выполняется DBMS. Это действие состоит либо в предотвращении события, либо в отмене его результата (например, в удалении вставленного кортежа). Фактически таким действием может быть любая последовательность операций БД, возможно, даже операций, никак не связанных с событием, вызвавшим срабатывание триггера. Далее мы рассмотрим триггеры в SQU, а затем SQLЗ-pacшиpeния ограничений SQL2, называемых утверждениями и включающих в себя некоторые аспекты триггеров. 6.6.2 Триггеры SQL3 Триггеры SQL3 предоставляю Г пользователю ряд различных опций, касающихся события, условия и действия. L Действие можно выполнить до события, после или вместо события, вызвавшего срабатывание триггера. 2. Действие может относиться как к старым, так и к новым значениям кортежей, которые были введены, уда;!ены или изменены событием, вызвавшим срабатывание триггера. 3 События обновления могут определять отдельный столбец или множество столбцов. 4. Уачовие можно задать в пункте WHEN, и действие выполняется, если только при наступлении события, вызвавшего срабатывание триггера, срабатывает правшю и выполняется данное условие. 5. Программист может установить режим выполнения действия: (a) один раз для каждого изменяемого кортежа; (b) один раз лля всех кортежей, изменяемых операцией на БД. Прежде чем рассматривать детали синтаксиса триггеров, приведем пример, иллюстрирующий наиболее важные синтаксические и семантические аспекты. В этом примере триггер выполняется один раз для каждого изменяемого кортежа. Пример 6.16. Запишем триггер SQL3 для таблишя MovieExec(name, address, cert#, netWorth) относящийся к HSMCHeHHsivi атрибута netWorth. Он предназначен для позобновления любой попытки снизить чистый доход президента студии. Описание триггера дано на рис. 6,7. 1) CREATE TRIGGER NetWorthTrigger 2) AFTER UPDATE OF netWorth ON MovieExec 3) REFERENCING 4) OLD AS OldTuple, 5) NEW AS NewTuple 6) WHEN(OldTuple.netWorth > NevvTupie.netWorth) 7) UPDATE MovieExec 8) SET netWorth = OirfTuplenetWorth 9) WHERE cert# - NewTuple.cert# 10) FOR EACH ROW Рис. 6.7. Триггер SQL3 В строке (!) описание начинается ключевыми словами CREATE TRGGER и именем триггера. В строке (2) указано событие, вызываюшее срабатывание тргггера, а менно обновление атрибута netWorth отношения MovieExec. В строках (3) - (5) показано, как при условии и действии триггера npoKSBOflinrcH ссылки на старый кортеж (кортеж до обновления) и новый кортеж (кортеж после обновления). На строках (4) и (5) они описаны как OldTuple и NewTuple соответственно. В условии и действии эти имена можно применять как перемеиные кортежей, указанные в пункте FROM обычного запроса SQL Строка (6) - это условие триггера, означающее, что действие выполняется, если тачько новый чистый доход администратора ниже старого. В строках (7) - (9) описано действие в виде обычного оператора изменения SQL. В принципе при этом рассматривается кажаый кортеж, но пункт WHERE на строке (9) гарантирует, что опер;п-ор действует только на измененный кортеж (кортеж с подходящим атрибутом cert#). И наконец, строка (10) выражает требование, согласно которому триггер срабатывает один раз для каждого измененного ко-этежа. Есг(и такого кортежа нет. он срабатывает один раз дпя каждого оператора SQL, независимо от кшичества инициирующих триггер изменений кортежа. О Конечно, пример 6.16 юшюстрирует только некоторые особенности триггеров SQL3. Далее кратко перечислены обеспечиваемые триггерами режимы и способы нх выражения. Согласно строке (2) рис. 6.7, действие выполняется после события, вызыва- ющего срабатывание триггера, что выражено ключевым словом AFTER. Возможны другие варианты: 1. BEFORE означает, что условие пункта WHEN проверяется перед наступлением события, вызывающего срабатывание трип-ера. Если условие истинно, выполняется действие триггера. Тогда событие, вызвавшее изменение, выполняется нeзaБиcню от того. Было ли истинным условие. 2. INSTEAD OF-действие выполняется (при выполненш! условия WHEN), а инициирующее триггер событие не выполняется вообще. Помимо UPDATE, инициировать триггер могут события INSERT и DELETE. Прешюжение OF netWorth в строке (2) рис. 6.7 применяется дпя событий UPDAiE и означает, что событием является только изменение атрибутов, перечисленных после ключевого слова OF. Применять OF с событиями INSERT НЛП DELETE запрещено; эти события имеют смысл только пля целых кортежей.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |