Інструкція CREATE

Платформа SQL Server підтримує ядро ​​стандарту ANSI з додаванням тригерів типу INSTEAD OF та перевірки змін стовпців. Ця платформа не підтримує пропозиції REFERENCING та WHEN. Синтаксис наводиться нижче.

TRIGGER имя_тригера ON имя_таблицы [WITH ENCRYPTION]

[NOT FOR REPLICATION]

[IF UPDATE (стовпець) [ РОАТІ (стовпець)] […]] блок_коду

(CREATE ALTER) TRIGGER имя_тригера

Створюється новий тригер з ім'ям тригера або змінюється існуючий тригер ім'я тригера шляхом додавання або зміни властивостей тригера або блоку коду. При зміні існуючого тригера права доступу та залежності існуючого тригера зберігаються.

ON ім'я_таблиці

Оголошується таблиця чи уявлення, яких залежить тригер. У уявленнях можуть бути визначені тригери INSTEAD OF, якщо ці уявлення можна оновлювати і вони містять пропозиції WITH CHECK.

WITH ENCRYPTION

FOR AFTER INSTEAD OF

Вказує, коли має запускатися тригер. (Ключові слова FOR і AFTER є синонімами.) Пропозиція AFTER показує, що тригер запускається тільки після запуску успішного виконання операції з модифікації даних (та інших каскадно дій, що запускаються, і перевірок обмежень). Тригер INSTEAD OF подібний до тригера BEFORE стандарту ANSI в тому, що код тригера може повністю замінити операцію з модифікації даних. При цьому тригер запускається замість операції із модифікації, яка запустила тригер. Тригери типу INSTEAD OF DELETE не можна використовувати, якщо видалення викликає каскадні дії. Доступ до стовпців TEXT, NTEXT або IMAGE мають лише тригери INSTEAD OF.

WITH APPEND

До таблиці або подання додається додатковий тригер існуючого типу. Підтримка цієї пропозиції введена для зворотної сумісності з попередніми версіями продукту, і цю пропозицію можна використовувати тільки з тригерами FOR.

NOT FOR REPLICATION

Запобігає запуску тригера при виконанні операції з модифікації даних, ініційованої вбудованою системою реплікації SQL Server.

Дозволяє вибрати конкретний стовпець, що запускає тригер. Тригери, специфічні для стовпця, запускаються лише за операціях UPDATE і INSERT, але з операціями DELETE. Якщо операція UPDATE або INSERT застосовується до стовпця, що не входить до списку, тригер не запускається.

Платформа SQL Server дозволяє використовувати кілька тригерів для однієї операції з маніпуляції у таблиці чи поданні. Таким чином, можна використовувати відразу три тригери UPDATE в одній таблиці. У таблиці можна використовувати кілька тригерів AFTER. Порядок їх виконання є невизначеним, проте перший і останній тригер можна вказати явно, за допомогою збереженої системної процедури spsettriggerorder. У будь-якій таблиці допускається використовувати лише один тригер INSTEAD OF на інструкцію INSERT, UPDATE або DELETE.

У SQL Server в одній інструкції зі створення тригера можна визначити будь-яку комбінацію тригерів, розділивши їх комами. (При цьому той самий код запускається для кожної інструкції у визначенні комбінації.)

Платформа SQL Server неявно використовує для тригерів форму FOR EACH STATEMENT стандарту ANSI.

При запуску тригера SQL Server записує значення дві важливі псевдотаблиці: deleted і inserted. Вони відповідно еквівалентні псевдотаблиці before і after, описаним раніше в розділі «Загальні правила»,що відноситься до стандарту ANSI. Ці таблиці за структурою ідентичні таблиці, в якій створено тригер, за винятком того, що вони містять старі дані до виконання операції з модифікації (deleted), і нові значення, що є в таблиці після цієї операції (inserted).

При вказанні пропозиції AS IF UPDATE (стовпець) проводиться перевірка виконання операції INSERT чи UPDATE у цьому стовпці чи стовпцях; ця пропозиція аналогічна конструкції з/РШЩстовпець) у стандарті ANSI. Можна вказати кілька стовпців, додавши окремі пропозиції (УРОЛЩСтовпець). Якщо за пропозицією AS IF UPDATE (стовпець) встановити блок коду Transact-SQL BEGIN…END, можна виконати в тригері кілька операцій Transact-SQL. Ця пропозиція функціонально еквівалентна операції IF...THEN...ELSE.

Крім втручання у виконання операцій з модифікації даних, показаного у прикладі на ANSI SQL, платформа SQL Server дозволяє виконувати інші види операцій під час операції з модифікації даних. У наступному прикладі ми вирішили, що таблиця sales_archive_2002 більше не використовується, і той, хто намагатиметься вставити в неї дані, отримає повідомлення про це обмеження.

Платформа SQL Server забороняє використовувати такі інструкції у блоці коду Transact-SQL тригера: ALTER, CREATE, DROP, DENY, GRANT, REVOKE, LOAD, RESTORE, RECONFIGURE і TRUNCATE. Крім того, не дозволяється інструкції DISK та команда UPDA TE STA TISTICS.

Платформа SQL Server дозволяє запускати рекурсивні тригери, використовуючи параметр recursive triggers системної процедури sp_dboption, що зберігається. Рекурсивні тригери в результаті виконання запускають самих себе. Наприклад, якщо тригерINSERT у таблиці Т1 виконує операцію INSERT у таблиці Т1, він може виконати рекурсивну операцію. Оскількирекурсивні тригери можуть бути небезпечними, вони за промовчанням відключені.

Також SQL Server дозволяє використовувати вкладені тригери до 32 рівнів вкладеності. Якщо будь-який із вкладених тригерів виконує операцію ROLLBACK, наступні тригери не запускаються. Приклад вкладених тригерів: Тригер у таблиці Т1 запускає операцію над таблицею Т2, у якій є тригер, який запускає операцію над таблицею ТЗ. Запуск тригерів скасовується, якщо формується нескінченний цикл. Вкладені тригери можна дозволити за допомогою параметра nested triggers процедури sp_configure, що зберігається. Якщо вкладені тригери відключені, рекурсивні тригери також відключені, незалежно від відповідного параметра sp_dboption, що зберігається.

Зауважте, що інструкції CREATE в SQL Server дозволяють використовувати відстрочену роздільну здатність імен (deferred name resolution). Це означає, що команда обробляється навіть у тому випадку, якщо вона посилається на об'єкт бази даних, що ще не існує.

Додаткова інформація на тему

Способи та методи використання інструкції CREATE/ALTER VIEW у базах даних на платформі SQL Server