С.Д. Кузнецов - Основы баз данных (1121716), страница 82
Текст из файла (страница 82)
Только в этом случае операции обновления будут выполняться корректно, независимо от того, имеются ли в базе данных представления, определенные над моне ктсн емР или между моне В1сн емР, М1РР Е КТСН ЕМР и ЕМР. Очевидный вывод из приведенного анализа заключается в том, что единственным способом обеспечить корректность выполнения операций обновления через представления (допускаюшие операции обновления) 395 Основы бвэ данных Курс является включение в определение каждого представления раздела НТТН САНСАОКО СННСК ОРТ1ОМ. В этом случае поведение системы булет оставаться корректным при введении дополнительных представлений над представлением мОРМ н1сн дмР, между представлениями МОРЯ н1сн емР и МТООЬН НТСН РМР или между прелставлением М1ООЬН НТСН НМР и базовой таблицей РНР, если в определениях всех этих представлений присутствуетраздел МТТН САНСАОЕР СннСк ОРТ1ОМ.
Исторический очерк Завершим обсуждение возможностей применения операций обновления к виртуальным таблицам небольшим экскурсом в историю. На протяжении более чем тридцатилетней истории реляционных баз данных вопрос о возможности однозначной интерпретации операций обновления баз данных через виртуальные таблицы интересовал многих исследователей. Причины этого интереса состоят в следующем. Во-первых, как отмечалось в лекции 3, одной из наиболее привлекательных черт реляционной алгебры является замкнутость относительно понятия отношения. В любой алгебраической операции, операндом которой является отношение, в качестве операнда можно использовать алгебраическое выражение.
С другой стороны, имеется явное неравноправие по отношению к операциям обновления. Мы можем вставлять, модифицировать и удалять кортежи в базовых отношениях, но не можем (в обшем случае) применять эти операции к алгебраическим выражениям. Хотелось максимальным образом устранить подобное неравноправие. Во-вторых, на первый взгляд задача не является слишком трудной (по крайней мере, если оставаться в пределах реляционной алгебры). Действительно, базовых операций совсем немного, и каждая базовая операция очень проста. К сожалению, это ошущение простоты проблемы оказалось обманчивым. Было выполнено множество исследований, опубликовано множество статей (нам кажется нецелесообразным приводить список этих статей в данном курсе), но так и не удалось обнаружить полное множество алгебраических выражений, для которых возможна однозначная интерпретация операций обновления.
На мой взгляд, ланная ситуация оказала заметное влияние на подход к решению проблемы применимости операций обновления к виртуальным таблицам, которым руководствуются разработчики языка Я (.. В двух первых международных стандартах (Я)(./89 и Б9(./92) к виду таких виртуальных таблиц прельявлялись чрезмерно строгие требования. Это показывают даже те простые примеры, которые приводились в начале ланного раздела.
И конечно, наличие таких ограничений в стандарте 39в Лекция 17 язык баз данных 80Ы средства манипулирования данными языка приводило к тому, что в реализациях Я.>Ь появлялось много расширений, которые поддерживались только отдельными компаниями-производителями СУБД. Создается впечатление, что когда более десяти лет назад был инициирован проект нового стандарта Я)Ь-3 (который в конце концов привел к появлению Ь0Ь:1999), разработчики находились в состоянии растерянности. Кстати, одна из идей, включавшихся в ранние варианты проекта Я) Ь- 3, состояла в том, чтобы расширить определение представляемой таблицы средствами, позволяющими явно специфицировать действия, которые нужно предпринимать при выполнении над представлением операций 1ккккт, пргтлтк и иккктк.
Другими словами, предлагалось переложить решение проблемы на плечи пользователей СУБД. Конечно, это радикальный подход, но, с другой стороны, он мог бы привести к полной анархии. Как можно заметить, в официально принятом стандарте Я.)Ь:1999 используется некоторый компромиссный подход. В стандарте не фиксируются жесткие правила, ограничивающие вид виртуальных таблиц, к которым применимы операции обновления. Вместо этого сформулирован ряд рекомендаций, которыми следует руководствоваться производителям СУБД. Нельзя утверждать, что такое решение является идеальным, но более удачного решения найти не удалось.
Операции обновления баз данных и механизм триггеров Термин тлригге)т в контексте реляционных баз данных был введен в обиход участниками проекта Яуяеш К (разд. «Введение» лекции 11). В терминологии этого проекта триггером называлась хранимая в базе данных процедура, автоматически вызываемая СУБД при возникновении соответствующих условий. При определении триггера указывались два условия его применимости — общее условие (имя отношения и тип операции манипулирования данными) и конкретное условие (логическое выражение, построенное по правилам, близким к правилам ограничений целостности), а также действие, которое должно быть выполнено над БД при наличии условий применимости.
Конечно, термин триггер в данном контексте является жаргонным. Но, с другой стороны, он достаточно точно соответствует ситуации: для применения процедуры должны быть произведены «возбуждаюшиеа ее действия. Как отмечалось в лекции 11, после завершения проекта оуагегп В на протяжении более десяти лет триггеры не поддерживались ни в одной коммерческой Я0Ь-ориентированной СУБД.
Но затем практически во всех ведущих СУБД механизм триггеров в том или ином виде бьш реализован. Э97 Основы баа данных Курс В стандарте же языка БО) спецификации триггеров отсутствовали до принятия стандарта БО).:1999. По словам главного редактора стандартов ЯгЕ/92 и 301.:1999 Джима Мелтона, эта спецификация была уже полностью готова к люменту принятия Я.>1/92 и не вошла в текст стандарта только по причине ограниченности его объема.
Однако, как мне кажется, этому препятствовали и расхождения в подходах, существовавшие между основными компаниями-производителями СУБД. Заметим, что альтернативным термином по отношению к базам данных, содержащим триперные процедуры, является термин актпивная база данных. Наверное, этот термин более точен, поскольку действительно речь идет о базах данных, содержащих процедуры, которые автоматически вызываются при срабатывании связанных с ними правил. Однако в обиходе пользователей Я~).-ориентированных СУБД по-прежнему более распространен термин триггер. Понятие триггера а 80Е:1998 В языке обеспечиваются возможности определения триггеров, которые вызываются (дорабатывают») при вставке одной или нескольких строк в указанную таблицу, при модификации одной или нескольких строк в указанной таблице или при удалении одной или нескольких строк из указанной таблицы.
Вообще говоря, триггер может производить любое действие, необходимое для соответствующего приложения. Можно определить триггеры, срабатывающие по одному разу для операций 1Н9КПт, црпхтк или ОЯЬКтя, но существует и возможность определения триггеров, вызываемых при вставке, модификации или удалении каждой отдельной строки. Таблица, с которой связывается определение триггера, называется предметной таблицей 1диЬ/ес( гаЫг), а оператор БО)., выполнение которого приводит к срабатыванию триггера, мы будем называть инициирующим (!пбхеплб 5)гх. дттлееиеп 1). Триггеры могут срабатывать после и до реального выполнения инициирующего оператора БО1..
В теле триггера допускается доступ к значениям вставляемых, модифицируемых и удаляемых строк. В случае операции модификации возможен доступ к значениям строк до модификации и к значениям после модификации. В соответствии со стандартом Я ) 1.: 1999 любой триггер ассоциируется только с одной базовой таблицей. Не допускается определение триггеров над представлениями*.
Можно придумать различные способы полезного применения механизма триггеров, но принято считать, что основными областями использования этого механизма являются следующие. * Непонятно, откуда происходит это ограничение. Скорее всею, в будущих версиях стандар- та оно будет снято. 398 Лекция 17 Язык баз данных ЯРЫ средства манипулирования данными ° Журнализацил и аудит. С помощью триггеров можно отслеживать изменения таблиц, для которых требуется поддержка повышенного уровня безопасности.
Данные об изменении таблиц могут сохраняться в других таблицах и включать, например, идентификатор пользователя, от имени которого выполнялась операция обновления; временную метку операции обновления; сами обновляемые данные и т, д. ° Согласование и очистка данных. С любым простым оператором Яг(., обновляющим некоторую таблицу, можно связать триггеры, производящие соответствующие обновления других таблиц.
Например, с операцией вставки новой строки в таблицу ЕМР (прием на работу новою служащего) можно было связать триггер, модифицирующий значения столбцов Рерт емр ио и Рерт тотАР ЯАРа строки таблицы Рерт со значением столбца РЕРТ ИО, которое соответствует номеру отдела нового служащего. ° Операции, не связанные с изменением базы данных. В триггерах могут выполняться не только операции обновления базы данных. Стандарт Я;П позволяет определять хранимые процедуры (которые могут вызываться из триггеров), посылающие электронную почту, печатающие документы и т.
д. Синтаксис определения триггеров и типы триггеров Для более подробного обсуждения механизма триггеров в Я.)(.:(999 необходимо ввести набор синтаксических правил: тттддет де1тптт(оп СНЕАТЕ ТН16ОЕЕ Гг(ддег папе ( ВЕРОНЕ ] АРТЕК ( 1ИЯЕНТ ] РЕьЕТЕ ( ОРРАТЕ [ ОР со1плп сопеаа1(вг ] ) ОИ ГаЫе папе ( ЕЕРЕНЕИС1ИО о1с) ог пеи уа1цев а1(ав 1(вг Шддегес( асгусп ггуддегед асс(оп [ РОН ЕАСН ( ЕОХ [ ЯТАТЕМЕИТ ( ИНЕИ 1е(Г ратеп сопЫГ)опа1 ехргевв(оп т(д)тт рагеп ] Гттддетед ЯОЬ втатевепт гт(ддетед ЯОй вгаге~пепг ::= ЯОЬ ртосес)пге вгатевепг ВЕ61И АТОМТС ЯОЬ ртосес)цте втатеыепт вел(со1оп11вт ЕИР ' В примерах этой лекции мы будем считать, что в столбце парт тотдь вть таблицы рвут хранится суммарное значение заработной платы служатвнх соответствуввцето отдела.
399 Основы бвзданных Курс о1д ог пен уа1пеа а1(ав ::= ОЬО [ вОХ ) [ АЯ ) согге1ао(оп паве МЕХ [ ЕОХ ) [ АЯ ] согге1ао(оп паве Оьп тАВье [ АЯ ) Ыепс(г(ег ИЕХ ТАВЬЕ [ АЯ ) сепг(г(ег Естественно, в языке имеется и конструкция, отменяюшая определение триггера: РЕОР ТЕТССЕЕ Сх(ддег паве. (Конструкция АЬТЕЕ ТВТССЕН в языке ЯОЬ не поддерживается.) Как мы видим, синтаксические правила допускают несколько разновидностей определения триггера. Кратко обсудим эти разновидности. Триггеры вннонн и лнтнн Если в определении триггера указано ключевое слово ВееОее, то триггер будет срабатывать непосредственно до выполнения операции обновления базовой таблицы соответствуюшим инициируюшим оператором Я()Ь.
При задании ключевого слова АЕТЕН триггер будет вызываться немедленно после выполнения инициируюшего оператора. Триггеры тинннт, пнплтн и пньнтн Выбор одного из этих ключевых слов при определении триггера указывает на природу события, которое должно приводить к срабатыванию триггера. При задании ключевого слова 1ИЯЕВТ к срабатыванию триггера может привести только выполнение операции вставки строк в предметную таблицу. Если указываются ключевые слова ОВОАТЕ или ОЕЬЕТЕ, то число возможных событий„приводяших к срабатыванию триггера, возрастает.
Кроме явных операций модификации строк предметной таблицы или удаления из нее строк к срабатыванию триггера могут привести ссылочные действия (см. раздел Средства определения, изменения и ликвидации базовых таблиц» лекции ЬЗ). Заметим, что в стандарте Я()Ь: [999 отсутствует возможность определения триггеров, для которых событием было бы выполнение операции выборки из предметной таблицы.