- •Віртуальні таблиці (візії) Визначення візії
- •Перейменування атрибутів візії
- •Модифікація змісту візій
- •Тема 14. Обмеження та тригери в sql Активні елементи
- •Ключі відношень Види ключів і обмеження
- •Оголошення первинного ключа
- •Ключі та індекси
- •Оголошення зовнішнього ключа
- •Стратегії забезпечення посилальної цілісності
- •Обмеження рівня атрибутів та кортежів
- •Обмеження not null
- •Обмеження check рівня атрибуту
- •Обмеження check рівня кортежу
- •Модифікація обмежень
- •Тригери в sql Тригери як правила „подія-умова-дія”
- •Тригери instead of
- •Тригери у Transact sql
- •Безпека
- •Категорії збережених процедур Системні збережені процедури
- •Локальні збережені процедури
- •Тимчасові збережені процедури
- •Розширені збережені процедури
- •Основи програмування у Transact-sql
- •Блоки операторів
- •Умовне виконання
- •Використання збережених процедур Виклик збереженої процедури
- •Створення збереженої процедури
- •Безпека даних
- •1.2. Реєстрація користувачів
- •Керування правами доступу
- •Кому надаються права доступу
- •Умови надання прав доступу
- •1.3.3. Об’єкти, на які поширюються права доступу
- •Операції, щодо яких специфікуються права доступу
- •Можливість передавання прав доступу іншим особам
- •Специфікація повноважень
- •Обов’язкові методи захисту
- •Ведення журналів доступу
- •Обхід системи захисту
- •Використання представлень для фільтрації повноважень
- •Хто може створювати представлення?
Тригери у Transact sql
Для аналізу синтаксису команди CREATE TRIGGER у Transact SQL скористаємось Books Online (Пуск\Microsoft SQL Server\Books Online).
Рис.14.13. Як знайти опис команди CREATE TRIGGER у BOOKS ONLINE
Наведемо визначення синтаксису команди CREATE TRIGGER у Transact SQL.
CREATE TRIGGER trigger_name ON { table | view } [ WITH ENCRYPTION ] { { { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] } [ WITH APPEND ] [ NOT FOR REPLICATION ] AS [ { IF UPDATE ( column ) [ { AND | OR } UPDATE ( column ) ] [ ...n ] | IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask ) { comparison_operator } column_bitmask [ ...n ] } ] sql_statement [ ...n ] } }
Рис.14.14. Transact-SQL cинтаксис команди CREATE TRIGGER у BOOKS ONLINE
Рядки |
Що вони містять |
CREATE TRIGGER trigger_name |
Заголовок, назва тригера |
ON { table | view } |
Ім’я таблиці або візії |
[ WITH ENCRYPTION ] |
Тригер зачиняється від інших користувачів і не реплікується |
{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] } |
FOR еквівалентно AFTER, залишено для сумісності. Помилково пропущено слово [DELETE]. deleted and inserted – таблиці попередніх і нових даних. |
[ WITH APPEND ] |
Для сумісності з версією 6.5. |
[ NOT FOR REPLICATION ] |
Тригер не виконується при реплікації |
[ { IF UPDATE ( column ) [ { AND | OR } UPDATE ( column ) ] [ ...n ] |
Перевірка, чи оновлювались колонки column |
| IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask ) { comparison_operator } column_bitmask [ ...n ] |
Визначення, чи оновлювався набір колонок, за допомогою бітової маски |
sql_statement [ ...n ] |
Умови і дії тригера як послідовність команд Transact-SQL deleted and inserted – таблиці попередніх і нових даних. |
Усього опис з прикладами займає12 великих екранних сторінок.
Приклад 14.10. Використання тригера для нагадування за допомогою Email
USE pubs
1) IF EXISTS (SELECT name FROM sysobjects
2) WHERE name = 'reminder' AND type = 'TR')
3) DROP TRIGGER reminder
4) GO
5) CREATE TRIGGER reminder
6) ON titles
7) FOR INSERT, UPDATE, DELETE
8) AS
9) EXEC master..xp_sendmail 'MaryM',
10) 'Don''t forget to print a report for the distributors.'
11) GO
Рис.14.15. Використання тригера для нагадування за допомогою Email
У цьому прикладі рядки 1-4 забезпечують видалення попередньої версії тригера. Будь-які зміни відношення titles (рядки 6,7) тягнуть відсилання Email адресату 'MaryM' з нагадуванням про необхідність роздрукувати звіт.
xp_sendmail відсилає вказаному адресату листа та приєднує результати виконання запиту. Опис xp_sendmail займає 4 великих екранних сторінки.
Команда GO (рядки 4, 11) формує пакет (від GO до GO). Пакет виконується по одному плану виконання, хоча не є транзакцією.
Приклад 14.11. ([8], стор.293). Нехай відношення Books містить перелік книг, а відношення BookOrders фіксує факти продажу книг. Якщо книга продана, у відношення BookOrders додається кортеж, і тоді у відношення Books в атрибуті sold треба поставити 1.
CREATE TRIGGER dbo.update_book_status
ON dbo.bookOrders
AFTER INSERT
AS
UPDATE Books
SET sold=1
WHERE titleId=
(SELECT bo.titleId
FROM bookOrders bo INNER JOIN inserted i
ON bo.orderId=i.orderId)
Рис.14.16. Приклад тригера для оновлення іншого відношення в разі вставки.
В передостанньому рядку використане відношення inserted, по якому ми визначаємо Id щойно проданої книги, та оновлюємо відповідний кортеж у Books. Напряму звернутись до inserted не можна, треба його з’єднати з іншим відношенням.
Тема 15. Збережені процедури – 2 год.
Збережені процедури (stored procedures) – фрагменти програмного коду, який зберігається і виконується на сервері БД.
Переваги збережених процедур
Продуктивність
Великий обсяг робіт виконується на сервері БД, який є зазвичай потужним комп’ютером з великим обсягом оперативної пам’яті. Вся робота виконується на сервері і лише результат повертається клієнту. Тим самим найбільш повно реалізуються переваги архітектури Клієнт-сервер. Крім того, збережені процедури синтаксично вірні та скомпільовані.
Рис.15.1. Збережені процедури зберігаються в БД
Централізація бізнес-логіки
Модифікувати збережену процедуру відповідно до нових вимог можна в будь-який момент, в одному місці. Тим самим усі програми, що використовують її, негайно прийдуть у відповідність з новими бізнес-правилами без безпосередньої модифікації.
Можливості програмування
Можливості програмування розширюються завдяки застосуванню таких поширених засобів програмування, як використання вхідних і вихідних параметрів, а також завдяки повторному використанню процедур.
Якщо розробникам зручно писати складні програми на таких мовах, як C + +, то
потім ці програми можна викликати з SQL Server засобами збережених процедур особливого типу, які називаються розширеними збереженими процедурами. Скомпільований на C++ код у цьому разі також зберігається в БД.
