Для аналізу синтаксису команди 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 pubs1) IF EXISTS (SELECT name FROM sysobjects2) WHERE name = 'reminder' AND type = 'TR')3) DROP TRIGGER reminder4) GO5) CREATE TRIGGER reminder6) ON titles7) FOR INSERT, UPDATE, DELETE 8) AS9) 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 не можна, треба його з’єднати з іншим відношенням.