
- •4.1. Історія мови sql та огляд її можливостей
- •4.2. Засоби пошуку даних
- •4.2.1. Основні конструкції мови, призначені для вибирання даних
- •4.2.2. Вирази, умови та оператори
- •4.2.3. Вибирання з кількох таблиць
- •4.2.4. Використання агрегатних функцій
- •4.2.5. Фраза group by. Групування таблиці за рядками
- •4.2.6. Фраза having. Умова вибирання для груп рядків
- •4.2.7. Фраза order by. Впорядкування рядків
- •4.2.8. Порядок обчислення запитів
- •4.2.9. Підзапити
- •4.2.10. Використання предикатів any, all, exists та in
- •4.2.11. Використання теоретико-множинних операторів
- •4.2.12. Запити, в яких реалізується квантор загальності
- •4.2.13, Використання невизначених значень
- •4.3. Засоби маніпулювання даними
- •4.3.1. Додавання рядків до таблиці. Оператор insert
- •4.3.2. Оновлення даних. Оператор update
- •4.3.3. Видалення рядків таблиці. Оператор delete
- •4.4. Операції над схемою бази даних
- •4.4.1. Створення бази даних. Оператор create database
- •4.4.2. Створення таблиці. Оператор create table
- •4.5.2. Використання індексів
- •4.6. Транзакції
- •4.6.1. Початок і завершення транзакції
- •4.6.2. Скасування транзакції. Точки збереження
- •4.7. Тригери
- •4.8. Додаткові можливості
4.6. Транзакції
Транзащія - це сукупність операцій з маніпулювання базою даних, що мають розглядатися як атомарна дія. Під терміном «атомарна дія» ми маємо на увазі таку дію, що повністю виконується або скасовується як єдине ціле, тобто щодо неї підтримується принцип «усе або нічого». Різні СКБД мають свою специфіку щодо підтримки транзакцій. Тому ми використовуватимемо гіпотетичний узагальнений синтаксис таких операцій,
4.6.1. Початок і завершення транзакції
Транзакція активізується командою
BEGIN TRANSACTION [<ім'я транзакції>]
і завершується командою
COMMIT [TRANSACTION]
за якою відбувається фактична зміна стану бази даних згідно з командами, що містяться в транзакції. Наприклад, якщо є така транзакція:
BEGIN TRANSACTION
INSERT INTO ФАКУЛЬТЕТ VALUES (1, "інформатики". "Іванов". "2/b". 42000) INSERT INTO ФАКУЛЬТЕТ VALUES (1, "економіки". "Петров". "З/а". 47000)
COMMIT
то в таблицю ФАКУЛЬТЕТ будуть вставлені або два рядки, або жодного - залежно від успішності виконання всієї транзакції.
4.6.2. Скасування транзакції. Точки збереження
Після здійснення транзакції зазвичай надається можливість з'ясувати, чи успішним було її виконання. Транзакцію можна скасувати навіть у разі її успішного виконання, застосувавши команду ROLLBACK (але вона має бути виконана до команди COMMIT). У цьому випадку база даних набуває того ж вигляду, який вона мала до виконання транзакції. Можна також вказати так звані точки збереження (save-point), або контрольні точки.
Загальний синтаксис команди ROLLBACK є таким:
ROLLBACK [TRANSACTION] [TO SAVEPOINT <ім'я точки збереження>]
Розглянемо приклад.
BEGIN TRANSACTION
INSERT INTO ФАКУЛЬТЕТ VALUES (1. "інформатики". "Іванов". "2/b". 42000) ROLLBACK TRANSACTION
INSERT INTO ФАКУЛЬТЕТ VALUES (1. "економіки". "Петров". "З/а". 47000) COMMIT
У таблицю ФАКУЛЬТЕТ буде вставлено лише відомості про факультет економіки, оскільки після додавання першого рядка відбувається скасування транзакції (додавання першого рядка анулюється).
Після застосування команди COMMIT усі дії, що є в транзакції, виконуються. Відміна транзакції призводить до скасування всіх дій, виконаних до моменту застосування команди ROLLBACK TRANSACTION.
За допомогою точок збереження можна скасовувати не всі виконані з початку транзакції дії, а лише їх частину. Синтаксис оголошення точки збереження є таким:
SAVEPOINT <ім'я точки збереження> Розглянемо приклад.
BEGIN TRANSACTION
UPDATE КАФЕДРА
SET Фонд = Фонд + Фонд/10 WHERE Корпус = "2/3"
SAVEPOINT save_it
DELETE FROM КАФЕДРА WHERE Корпус - "2/3"
ROLLBACK TO SAVEPOINT save_it COMMIT
Видалення рядків не відбудеться, оскільки здійснюється повернення до точки збереження save_it, що означена до команди видалення.
4.7. Тригери
Тригер — це SQL-оператор, що активізується під час виконання певних операцій над об'єктами бази даних. Об'єктами бази даних є таблиці, а операціями - додавання, видалення та заміна рядків. Тригери — це один із механізмів підтримки цілісності бази даних.
У найпростішому випадку синтаксис оголошення тригера є таким:
CREATE TRIGGER <ім'я тригера>
{BEFORE | AFTER} <операці! над таблицею> [OF <список полів>] ON <ім'я таблиці>
[WHEN (<умова>)] <оператори SQL>
Якщо умова у фразі WHEN є істинною або ця фраза відсутня, до (BEFORE) або після (AFTER) виконання операції INSERT, UPDATE чи DELETE над таблицею, зазначеною після слова ON, буде виконано вказані нижче оператори SQL. Коли таких операторів кілька, їх слід помістити між ключовими словами BEGIN ATOMIC та END. Конструкція другого рядка означення тригера називається реченням ініціювання, WHEN — умовою ініціювання, а <оператори SQL> — дією тригера.
Розглянемо приклади застосування тригерів.
Запит 4.50
Після видалення інформації про кафедру видалити інформацію про всіх викладачів кафедри.
CREATE TRIGGER Кафедраг_Видалення AFTER DELETE ON КАФЕДРА
DELETE FROM ВИКЛАДАЧ
WHERE ВИКЛАДАЧ. #D = КАФЕДРА.ДО
Запит 4.51
Після видалення рядка з відомостями про викладача встановити значення NULL в полі #Куратор тих записів із таблиці ГРУПА, що відповідають групам, де згаданий викладач був куратором.
CREATE TRIGGER Викладач_Видалення
AFTER DELETE ON ВИКЛАДАЧ
UPDATE ГРУПА
SET #Куратор = NULL
WHERE ГРУПА.#T = ВИКЛАДАЧ.#Т
Доступ до старих і нових значень рядків
Якщо виконується оновлення рядків таблиці, то в тригері допускається звернення до старих і нових значень рядків, що оновлюються. Для звернення до нового (старого) рядка слід вказати кваліфікатор NEW (OLD) перед іменем стовпця. Такі кваліфікатори дозволяється використовувати як в умові тригера, так і в описі його дії. Розглянемо приклади.
Запит 4.52_
Після додавання чи оновлення рядка в таблиці КАФЕДРА встановити значення поля Фонд у таблиці ФАКУЛЬТЕТ рівним сумі фондів усіх кафедр відповідного факультету.
CREATE TRIGGER ФАКУЛЬТЕТ_Фонд
AFTER INSERT OR UPDATE ON КАФЕДРА
BEGIN
UPDATE ФАКУЛЬТЕТ
SET Фонд = SELECT $иМ(Фонд)
FROM КАФЕДРА
WHERE КАФЕДРА.#F = КАФЕДРА.NEW.#F AND
ФАКУЛЬТЕТ.#F = КАФЕДРА.NEW.#F END
Тригери й транзакції
Дії, які виконуються під час основної операції та в тригері, становлять єдину транзакцію.
Перед виконанням додавання, оновлення та видалення неявно ініціюється команда BEGIN TRANSACTION.
Реалізується операція додавання/оновлення/видалення.
Ініціюється та виконується тригер;
4. Тригер скасовує транзакцію або за замовчуванням його дія завершується.
Запит 4.53
Дозволити додавання рядка з відомостями про кафедру лише в тому випадку, коли існує рядок із даними про факультет, якому належить кафедра (кафедри без факультету не буває).
CREATE TRIGGER Кафедра_Додавання BEFORE INSERT ON КАФЕДРА WHEN NOT EXISTS (SELECT *
FROM ФАКУЛЬТЕТ
WHERE ФАКУЛЬТЕТ.#F = КАФЕДРА.#F) BEGIN
ROLLBACK TRANSACTION END
Вкладеність тригерів
Тригери бувають вкладеними. Це означає, що маніпулювання рядком однієї таблиці може ініціювати тригер, який маніпулює рядками іншої таблиці. У свою чергу, маніпулювання рядками другої таблиці може ініціювати тригер, що маніпулює рядками третьої таблиці тощо. Вкладеність тригерів може призвести до «зациклення».
Обмеження на використання тригерів:
тригери не визначаються для віртуальних таблиць;
після видалення таблиці всі зв'язані з нею тригери також видаляються;
тригери визначаються лише для створених таблиць.
В усіх наведених прикладах тригери використовувалися для підтримки цілісності бази даних. Але існує багато інших можливостей використання тригерів. Наведемо лише деякі з них:
автоматичне обчислення значень похідних стовпців;
запобігання виконанню недозволених транзакцій;
виконання складних перевірок з метою захисту даних;
підтримка складних обмежень цілісності;
реєстрація подій, що відбуваються в базі даних;
збирання статистики щодо доступу до таблиць бази даних.