ТРИГЕРИ (невеликий відступ)

З усього сказаного вище в цьому розділі має бути очевидно, що для нас особливий інтерес представляє декларативна підтримка цілісності І хоча ситуація за останні роки покращилася, залишається фактом, що лише деякі продукти (якщо вони взагалі є) забезпечують таку підтримку з часу свого початкового появи на ринку Внаслідок цього обмеження цілісності найчастіше реалізуються процедурне використанням тригерних процедур Останні являють собою заздалегідь відкомпілювалися процедури, які зберігаються разом з базою даних (можливо, в самій базі даних) і викликаються автоматично при виникненні деяких зазначених подій Зокрема, приклад 1 (значення статусу повинні знаходитися в межах від 1 до 100 включно) може бути реалізований за допомогою триггерной процедури, яка викликається кожного разу при вставці кортежу в змінну відносини S, перевіряє цей знову вставляється кортеж і знову його видаляє, якщо значення статусу не входить в зазначені межі У цьому розділі наведено короткий опис тригерних процедур у звязку з тим, що вони мають значну практичну важливість Але необхідно відразу ж привести наступні зауваження

1 Саме тому, що вони є процедурами, тригерні процедури не можна вважати рекомендованим способом реалізації обмежень цілісності Користувачам складніше зрозуміти, як діють процедури, а для системи процедури створюють додаткові труднощі при оптимізації Слід також зазначити, що декларативні обмеження перевіряються при всіх відповідних обновленіях18, а тригерні процедури виконуються тільки при виникненні вказаної події (припустимо, при вставці кортежу в змінну відносини S)

2 Область застосування тригерних процедур не обмежується завданнями підтримки цілісності, які є темою цієї глави Замість цього, якщо врахувати зауваження, зроблені в п 1, фактично вони можуть виконувати інші корисні завдання і саме тому мають право на існування Деякі приклади таких інших корисних завдань наведені нижче

а) Передача користувачеві попередження про те, що виникло деяке ис ключение (наприклад, видача попереджуючого повідомлення, якщо наявна кількість деяких деталей на складі стає нижче критичного рівня)

б) Налагодження (тобто відстеження посилань на зазначені змінні та / або контроль над змінами стану цих змінних)

в) Аудит (наприклад, реєстрація інформації про те, хто і коли вніс ті чи інші зміни в певні змінні відносини)

г) Вимірювання продуктивності (наприклад, реєстрація часу настання або трасування зазначених подій в базі даних)

д) Проведення компенсуючих дій (наприклад, каскадна організація видалення кортежу постачальника для видалення також відповідних кортежів поставок) 19

Тому даний розділ, як і зазначено в його назві, носить характер відступу від основної теми

Розглянемо наступний приклад (Цей приклад заснований на мові SQL, а не мовою Tutorial D, оскільки в [33] не запропоновані, і не могла бути запропонована будь-яка підтримка тригерних процедур фактично він заснований на комерційному програмному продукті, а не на стандарті SQL, оскільки стандарт SQL не підтримує конкретний засіб, показане в даному прикладі) Припустимо, що в базі даних є уявлення LONDON_SUPPLIER, яке визначене в такий спосіб

CREATE VIEW LONDON_SUPPLIER AS SELECT S#, SNAME,

STATUS FROM  S WHERE CITY = London

За звичайних обставин, якщо користувач спробує вставити рядок в це подання, то середу підтримки мови SQL дійсно вставить рядок у відповідну базову таблицю S з таким значенням CITY, яке задано за замовчуванням для

18 Зверніть увагу на те, що в специфікаціях декларативних обмежень не передбачені явні вказівки для СУБД, коли повинні виконуватися перевірки цілісності А це і не потрібно, поперше, тому, що такі явні вказівки змушували б користувача, який оголошує обмеження, ви полнять зайву роботу, по-друге, тому, що користувач міг би їх задати неправильно Замість цього бажано, щоб сама система вирішувала, коли повинні проводитися ці перевірки (див анотацію до [95])

19 І дійсно, каскадне видалення – це типовий приклад триггерной процедури Але заслу живає уваги те, що таке видалення задано декларативно Автор аж ніяк не стверджує, що ссилоч ві дії – Це невдала ідея тільки тому, що вони реалізуються Тригерна (Тобто як реакція на деякий подія)

стовпця CITY (див главу 10) За умови, що за замовчуванням заданий місто, відмінний від Лондона загальний ефект цієї дії виявиться таким, що нова рядок не зявиться в цьому поданні Тому створимо триггерную процедуру наступним чином

CREATE TRIGGER LONDON_SUPPLIER_INSERT INSTEAD OF INSERT ON LONDON_SUPPLIER REFERENCING NEW ROW AS R

FOR EACH ROW

INSERT INTO S ( S#, SNAME, STATUS, CITY )

VALUES ( RS#, RSNAME, RSTATUS, London )

Тепер вставка рядка в це подання спричинить за собою те, що рядок буде вставлена ​​у відповідну базову таблицю зі значенням CITY, рівним London, а не зі значенням, що застосовується за умовчанням (І новий рядок тепер буде зявлятися в поданні, в повній відповідності з поставленим завданням)

З цього прикладу слідують певні висновки, наведені нижчеПримітка Ці висновки не належать тільки до мови SQL, незважаючи на той факт, що наведений приклад заснований на SQL (конкретні відомості про засоби SQL дано в наступному розділі)

1 Загалом, в операторі створення тригера CREATE TRIGGER, крім усього іншого,

визначені подія, умова і дію таким чином:

■&nbsp&nbsp&nbsp&nbsp&nbsp подією є операція в базі даних (у цьому прімеое INSERT ON LONDON_SUPPLIER)

■&nbsp&nbsp&nbsp&nbsp&nbsp умова- це логічне вираз, який повинен приймати значення TRUE для того, щоб було виконано дію (якщо умова не вказано явно, як в даному прикладі, то воно за замовчуванням дорівнює npocто TRUE)

■&nbsp&nbsp&nbsp&nbsp&nbsp дію – Це і є сама триггерная процедура (у даному прикладі INSERT

INTO  S  ..&quot)

Подія і умова разом іноді називають тріггерним подією, а поєднання всіх трьох компонентів (подія, умова і дія) зазвичай називають просто тригером З очевидних причин тригери іменуються також правилами подія-условіедействіе (Event-Condition-Action – ЕСА) або скорочено правилами ЕСА

2 До можливих подій відноситься виконання операцій INSERT, DELETE, UPDATE (можливо, над певними атрибутами), досягнення кінця транзак ций (COMMIT), наступ зазначеного часу доби, витікання певного інтервалу часу, порушення зазначеного обмеження і тд

3 Загалом, дія може виконуватися до (BEFORE), після (AFTER) або замість (INSTEAD OF) дії, обумовленого зазначеним подією, за умови, що ці варіанти мають сенс

4 Загалом, дія може виконуватися для кожного рядка (FOR EACH ROW) або для кожного оператора (FOR EACH STATEMENT), за умови, що ці варіанти мають сенс

5 Загалом, при виконанні дії, що визначається тригером, повинен бути пре бачено спосіб, що дозволяє посилатися на дані в тому вигляді, який вони ма ють до і після виникнення вказаної події, за умови, що застосування такого засобу дійсно має сенс

6 Базу даних, яка має повязані з нею тригери, іноді називають активної базою даних

На завершення цього розділу слід зазначити, що тригери, безумовно, мають важливу область застосування, але ними слід користуватися з обережністю і, ймовірно, не вдаватися до них взагалі, якщо є альтернативний спосіб вирішення нагальної завдання Нижче перераховані деякі причини, з яких застосування тригерів на практиці може викликати появу певних проблем

■ Якщо одне й те ж подія викликає запуск (Як прийнято називати цю подію на професійному жаргоні) кількох різних тригерів, то послідовність їх активізації може виявитися, з одного боку, важливою, а з іншого – неопре поділеній

■ Можуть виникати ланцюжка запуску тригерів, при якій запуск тригера Т1 викли кість активізацію тригера Т2, який викликає активізацію тригера ТЗ і тд

■ Запуск тригера т може навіть знову викликати рекурсивний запуск самого цього тригера

■ У результаті наявності тригерів навіть прості операції INSERT, DELETE або UPDATE можуть призводити до такого ефекту, який принципово відрізняється від очікуваного користувачем (Особливо якщо задано ключове слово INSTEAD OF, як у наведеному вище прикладі)

Якщо врахувати всі описані вище зауваження, то має бути очевидно, що сумарні результати дії деякої певної сукупності тригерів можуть виявитися досить складними для розуміння Декларативні рішення, якщо вони можливі, завжди є більш кращими в порівнянні з процедурними

 

Джерело: Дейт К Дж, Введення в системи баз даних, 8-е видання: Пер з англ – М: Видавничий дім «Вільямс», 2005 – 1328 с: Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*