Что такое триггер в sql: CREATE TRIGGER (Transact-SQL) — SQL Server

Триггеры

Триггеры являются наиболее
эффективным инструментом сохранения целостности баз данных, так как позволяют
подробно проанализировать события, происходящие в системе.  Все триггеры можно разделить на два класса:
триггеры DML – перехват  команд insert, update, delete и триггеры DDL – перехват  команд DDL. В свою очередь триггеры DML делятся
на триггеры After – выполняющиеся
после выполнения команды и триггеры Instead of – триггеры
выполняются вместо соответствующих команд SQL.

Триггеры DML

Структура и создание

Формат команды создания триггера следующий

create trigger [ schema_name
. ]trigger_name

on { table | view }

[ with <dml_trigger_option>
[ ,…n ] ]

{ for | after | instead of }

{ [ insert ] [ , ] [ update ] [ , ] [ delete ] }

[ with append ]

[ not for replication ]

as

{ sql_statement  [ ; ] [ …n ]
|

external name <method specifier [ ; ] > }

Здесь

■          
[
schema_name
. ]trigger_name – имя создаваемого триггера. Должно
удовлетворять требованиям, предъявляемым к идентификаторам. Имя триггера не
может начинаться с символа ‘#’,
поскольку триггер не может быть временным объектом.

■          
on { table | view } – опция указывает к какой таблице или
представлению (имя таблицы или представления) триггер будет относиться.  Только триггеры типа instead of могут создаваться для
представлений.

■                      
<dml_trigger_option> — опции триггера.  Можно использовать два вида опций  encryption
(шифровать)  и    execution as clause (задать контекст), но с
ними мы уже знакомы.

■                      
for | after | instead of –
определяется тип триггера. Опции и for и after являются синонимами.

■          
[ delete
] [ , ] [ insert ] [ , ] [ update ] —  указываются команды DML, на которые будет реагировать данный
триггер.  Следует указать, по крайней
мере, одну команду.

■          
with append 
— данная опция устарела и используется для совместимости.

■          
not for replication – опция показывает, что триггер не будет
срабатывать, когда во время репликации будут происходить изменения в таблице.

■          
sql_statement 
[ ; ] [ …n ] – последовательность команд языка Transact SQL, которые будут выполняться, при запуске триггера.

■          
external name <method specifier >– опция используется при создании триггера на
основе технологии  .NET.

Структура команды alter trigger несколько отличается от структуры команды, которую мы только
что разобрали, но все опции в ней те же самые. Вот эта команда.

alter trigger schema_name.trigger_name

on ( table | view )

[ with <dml_trigger_option>
[ ,…n ] ]

( for | after | instead of )

{ [ delete ] [ , ] [ insert ] [ , ] [ update ] }

[ not for replication ]

as { sql_statement [ ; ]
[ . ..n ] |

external name <method specifier> [ ; ] }

Удаление триггера DDL
осуществляется командой drop
trigger schema_name.trigger_name [ ,…n
]. Т.е.
одной командой можно удалить сразу несколько триггеров.

Триггеры after выполняются после успешного выполнения команд, вызвавших
его. Если команда, по каким либо причинам не выполняется, то не выполняется и
триггер. И команда и триггер выполняется в одной транзакции. Поэтому откат при
выполнении триггера приведет и к откату команды, вызвавшей его. Триггеры after могут быть определены
только для таблиц и не могут быть для представлений. Для таблицы можно
определить несколько after-триггеров.

Триггеры instead of выполняются
вместо операций DML и
по одному для каждой операции. Эти триггеры могут создаваться и для
представлений.

В триггерах after используются специальный инструментарий для определения того,
что произошло с таблицей (чем вызван запуск триггера). Функция update (column) определяет, был
или не был модифицирован данный столбец. Относиться к командам update и insert. Если
столбец был модифицирован, то функция возвращает TRUE. Функция columns_updated() позволяет
определить, какой столбец был изменении. 
Функция возвращает двоичное число, каждый бит которого относиться к
конкретному столбцу. Если бит равен 1 то это значит,
что столбец был изменен командой update или insert.

Перед выполнением для триггера
автоматически создаются две временные таблицы: inserted и deleted. Их
содержимое зависит от того, какая операция была выполнена:

■          
При выполнении команды insert
таблица inserted будет содержать новые строки.
Таблица deleted будет пуста.

■          
При выполнении команды delete
таблица deleted будет содержать удаляемые
строки, таблица inserted будет
пустой.

■          
При выполнении команды update
таблица deleted будет содержать старые значения
строк, таблица inserted – новые.

В случае триггера instead of таблицы deleted и inserted будут содержать строки, которые соответственно должны быть
удалены или должны быть вставлены. 

Во временные таблицы (deleted и inserted) нельзя вносить какие-либо изменения.
Но из триггера можно менять содержимое любых других таблиц. Из триггера нельзя выполнять
следующие команды языка Transact SQL:
reconfigure, create database, alter database, drop database, restore database, restore log, load database, load log.

На время выполнения триггера
происходит блокирование данных, с которыми он работает, так что из других
процедур нельзя к ним обратиться. Поэтому триггер должен планироваться таким
образом, чтобы его выполнение не занимало слишком много времени.

Если триггер обращается к таблице, которая защищена другим
триггером, то возникает ситуация вложенности. Всего по умолчанию возможно до 32
вложений, как для хранимых процедур и пользовательских функций. Если уровень
вложенности превосходит допустимый, то возникает ошибка. Вложенные триггеры
можно отключить, если использовать системную хранимую процедуру sp_configure.
Возможен и рекурсивный вызов триггера при обращении триггера к той же таблице.
По умолчанию рекурсивный вызов триггеров отключен. Так же как и вложенные триггеры,
рекурсивные триггеры лучше не использовать.

Как уже было сказано, для одной таблицы можно создать
несколько триггеров, причем настроить на одну операцию. Для того чтобы внести
порядок в выполнение таких триггеров можно использовать хранимую процедуру sp_settriggerorder, имеющую следующую
структуру вызова.

sp_settriggerorder[@triggername
= ] ‘triggername’

, [@order = ] ‘value’

, [@stmttype = ] ‘statement_type’

Здесь

■          
[@triggername = ] ‘triggername’ –
определяет имя триггера, которое может содержаться и в переменной.

■          
[@order = ] ‘value’ –
порядок следования триггера. Который может быть:

o       
first
– выполняется первый.

o       
last
– выполняется второй.

o       
none
– порядок не определен.

■          
[@stmttype = ] ‘statement_type’ – тип инструкции.

 

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

Наконец триггер не возвращать
никаких наборов строк. Эта возможность считается устаревшей и будет удалена в
будущих версиях SQL Server.

Примеры триггеров

В Листинге 3.83 представлен простой триггер after,
который запрещает обновлять значение столбца t1 для таблицы table1.
При этом в вызывающий модуль с помощью функции raiserror будет
возвращено сообщение о причине отказа. Поскольку триггер расположен в одной
транзакции с командой, которая вызвала данный триггер, то команда rollback transaction возвращает состояние таблицы в исходное положение.

Листинг
3. 83

create trigger no_update on
table1

after update

as

if update(t1)

begin

        raiserror (‘Обновлять нельзя’, 15,1)

        rollback transaction

end

Рассмотрим
еще один пример (см. Листинг 3.84).

Листинг
3.84

create trigger dt_del on
dbo.students

instead of delete

as

begin

—удалить из таблицы marks

        delete from dbo.marks

        where id_student in (select id from deleted)

        if(@@error>0)

        begin

                rollback transaction

                raiserror(‘Ошибка удаления из таблицы marks’,16,3)

                return

        end

—удалить из таблицы students

        delete from dbo.students

        where id in (select id from deleted)

        if(@@error>0)

        begin

                rollback transaction

                raiserror(‘Ошибка удаления из таблицы students’,16,3)

                return

        end

return

end

Триггер из Листинга
3. 84
срабатывает на попытку удаления из таблицы dbo.students. Триггер в начале удаляет
строки из связанной таблицы dbo.marks, а затем уже из таблицы dbo.students (каскадное удаление). При этом
в триггере обрабатываются и возможные ошибки с откатом тразнакции и
возвращаением в приложение сообщения об ошибке.

Триггеры DDL

Триггеры DDL запускаются в ответ на команды DDL.

Вот формат команды создания триггера DDL

create trigger_name

on { all server | database }

[ with <ddl_trigger_option>
[ ,…n ] ]

{ for | after } { event_type | event_group } [ ,…n ]

as { sql_statement  [ ; ] [ …n ]

| external name < method specifier >  [ ; ] }

Здесь

■          
on { all server | database } – данная опция показывает,
будет ли триггер действовать в пределах текущей базы данных или в пределах
всего сервера SQL.

■          
<ddl_trigger_option> — данная опция аналогична такой же опции для
триггеров DML.

■          
event_type – имя события, при наступлении
которого должен быть запущен триггер. Список событий можно найти в
документации. Например, ALTER_INDEX означает, что триггер будет запускаться при
попытке  изменить индекс.

■          
event_group – можно указать целую группу
событий, при наступлении которых должен быть запущен данный триггер. Список
имен групп событий можно найти в документации. Например, DDL_TABLE_EVENTS означает
группу событий, связанных с таблицами.

Поскольку остальные опции нам
уже знакомы, перейдем сразу к примеру (см. Листинг 3.85).

Листинг
3.85

create trigger tr1

on database

for DDL_TABLE_EVENTS –триггер на операции с таблицами

as

begin

        rollback
transaction

        raiserror(‘Операции над таблицами запрещены’,16,3)

        return

end

При работе с DDL триггерами удобно использовать функцию eventdata().  Данная функция, запущенная внутри триггера
возвращает полную информацию о происшедшем событии. Особенностью функции
является то, что информация, которую она возвращает, имеет структуру xml-документа.

SQL.RU | Триггеры и порядок их выполнения

До версии SQL Server 7.0, мы могли создать только три триггера на одной таблице, один INSERT, один UPDATE и один DELETE. Ситуация изменилась с выходом SQL Server 7.0. Теперь мы можем на одну таблицу задать большое количество (Ограничено числом объектов в базе данных) триггеров каждого типа.

Порядок запуска триггеров при этом никак не определен и не гарантирован. В SQL Server 2000 появилась документированная процедура sp_settriggerorder, которая позволяет изменять порядок запуска триггеров. Она позволяет указать какие триггеры AFTER срабатывают первыми или последними. Триггеры AFTER, срабатывающие между первым и последним триггерами, выполняются в неопределенном порядке.

Для демонстрации запустим скрипт:

--Тестовая таблица
if object_id( 'dbo. TestTable', 'U' ) is not null
  drop table dbo.TestTable
go
create table dbo.TestTable ( id int identity, val varchar(64) )
go

--Триггер 1
if object_id ( 'dbo.TestTrigger01', 'TR' ) is not null
  drop trigger dbo.TestTrigger01
go
create trigger dbo.TestTrigger01 on dbo.TestTable
for insert
as
if @@nestlevel > 1 return
insert into dbo.TestTable
values ( object_name( @@procid ) )
go

--Триггер 2
if object_id ( 'dbo.TestTrigger02', 'TR' ) is not null
  drop trigger dbo.TestTrigger02
go
create trigger dbo.TestTrigger02 on dbo.TestTable
for insert
as
if @@nestlevel > 1 return
insert into dbo.TestTable
values ( object_name( @@procid ) )
go

--Триггер 3
if object_id ( 'dbo.TestTrigger03', 'TR' ) is not null
  drop trigger dbo.TestTrigger03
go
create trigger dbo.TestTrigger03 on dbo.TestTable
for insert
as
if @@nestlevel > 1 return
insert into dbo. TestTable
values ( object_name( @@procid ) )
go

--Триггер 4
if object_id ( 'dbo.TestTrigger04', 'TR' ) is not null
  drop trigger dbo.TestTrigger04
go
create trigger dbo.TestTrigger04 on dbo.TestTable
for insert
as
if @@nestlevel > 1 return
insert into dbo.TestTable
values ( object_name( @@procid ) )
go

--Триггер 5
if object_id ( 'dbo.TestTrigger05', 'TR' ) is not null
  drop trigger dbo.TestTrigger05
go
create trigger dbo.TestTrigger05 on dbo.TestTable
for insert
as
if @@nestlevel > 1 return
insert into dbo.TestTable
values ( object_name( @@procid ) )
go



Мы создали тестовую таблицу с 5-ю триггерами AFTER на событие INSERT. Каждый из триггеров добавляет запись в эту же таблицу.
Теперь проведем 1ый тест, выполнив следующий скрипт:


--Тест 1: Порядок запуска триггеров не задан
insert into dbo.TestTable
select 'Test1'
go
select * from dbo. TestTable
order by id
go

На картинке видно, что триггеры отработали исходя из времени своего создания, т.е. триггер, который создан раньше, отработал так же раньше других. Для подтверждения этого, пересоздадим триггер 2 и проведем тестовую вставку строки в нашу таблицу:


--Тест 2: Порядок запуска триггеров не задан, триггер №2 пересоздадим, чтобы он стал самым поздним по времени создания
--Триггер 2
if object_id ( 'dbo.TestTrigger02', 'TR' ) is not null
  drop trigger dbo.TestTrigger02
go
create trigger dbo.TestTrigger02 on dbo.TestTable
for insert
as
if @@nestlevel > 1 return
insert into dbo.TestTable
values ( object_name( @@procid ) )
go
insert into dbo.TestTable
select 'Test2'
go
select * from dbo.TestTable
order by id
go

Теория подтвердилась, но это всего лишь совпадение, и такое поведение не гарантировано и, как указано в БОЛ, без явного указания порядка, триггеры выполняются случайным образом. Но через процедуру sp_settriggerorder мы можем задать только триггеры AFTER, срабатывающие первыми или последними. Триггеры AFTER, срабатывающие между первым и последним триггерами, выполняются в неопределенном порядке. Т.е. если у нас 3 триггера на одно событие, то мы сможем гарантировать порядок срабатывания, через эту процедуру. Но если триггеров больше, как в нашем случае, то порядок будет гарантирован только для первого и последнего триггера. Для иллюстрации работы процедуры sp_settriggerorder, укажем в качестве первого триггера Триггер 2, а последним Триггер 3:


--Тест 3: Зададим порядок запуска триггеров 2 и 3
exec sp_settriggerorder 'dbo.TestTrigger02', 'first', 'insert'
go
exec sp_settriggerorder 'dbo.TestTrigger03', 'last', 'insert'
go
insert into dbo.TestTable
select 'Test3'
go
select * from dbo.TestTable
order by id
go

При попытке задать для другого триггера порядок выполнения, например первым (first), мы получим ошибку:
Msg 15130, Level 16, State 1, Procedure sp_settriggerorder, Line 163

There already exists a ‘first’ trigger for ‘insert’.

Просмотреть, задан ли порядок запуска для триггера можно с помощью функции OBJECTPROPERTY


select name
     , objectproperty( object_id, 'ExecIsFirstInsertTrigger') FirstInsertTrigger 
     , objectproperty( object_id, 'ExecIsLastInsertTrigger')  LastInsertTrigger 
from sys.triggers
where name like 'TestTrigger0%'

На что ещё стоит обратить внимание: Если один и тот же триггер необходимо назначить в качестве первого или последнего для нескольких типов инструкций, процедуру sp_settriggerorder необходимо выполнить для каждого типа инструкций. Кроме того, прежде чем триггер может быть назначен в качестве первого (First) или последнего (Last) выполняющегося триггера для того или иного типа инструкций, этот триггер должен быть сначала определен для данного типа.

Ну и последний тест, сбросим порядок запуска триггеров 2 и 3:


--Тест 4: Сбросим порядок запуска триггеров 2 и 3
exec sp_settriggerorder 'dbo. TestTrigger02', 'none', 'insert'
go
exec sp_settriggerorder 'dbo.TestTrigger03', 'none', 'insert'
go
insert into dbo.TestTable
select 'Test4'
go
select * from dbo.TestTable
order by id
go

Триггеры были запущены в том же порядке, что и до явного выставления порядка у триггеров 2 и 3.

триггеров в MS SQL Server

Посмотрите это видео о триггерах SQL Server для начинающих

Что такое триггер?

Триггеры — это объекты базы данных, аналогичные хранимым процедурам, которые запускаются автоматически при возникновении событий в базе данных. Триггер может запускаться различными действиями, такими как добавление или удаление строк из таблицы, вход в экземпляр сервера базы данных, обновление столбца таблицы, создание, изменение или удаление таблицы и т. д. Они также используются для поддержания целостности данных. Управляйте операциями сервера, контролируйте серверы и применяйте бизнес-логику или бизнес-правила.

Хотите пройти сертификацию по SQL Server? Учитесь у нашего эксперта по SQL, прошедшего сертификацию Microsoft SQL Server от Intellipaat.

Назначение триггера

Триггеры используются для автоматизации выполнения кода всякий раз, когда происходит событие. Триггеры — лучший вариант, если вам нужен определенный фрагмент кода, который всегда будет реализован в ответ на событие. В частности, они гарантируют, что код будет реализован или что событие, вызвавшее триггер, не сработает.

Триггеры используются для различных целей, в том числе:

  • Выполнение дополнительных проверок затронутой таблицы во время операций вставки, обновления или удаления.
  • Они позволяют кодировать сложные значения по умолчанию, которые ограничения по умолчанию не могут обработать.
  • Они позволяют контролировать, что происходит, когда кто-то вставляет, обновляет или удаляет данные из представления, которое обращается к двум или более таблицам.
  • Используя триггеры, пользователи могут определять агрегированные столбцы в таблице.

Хотите взломать интервью SQL? Лучшие вопросы для интервью Intellipaat по SQL предназначены только для вас!

Преимущества и недостатки триггера

Триггеры полезны, поскольку помогают поддерживать целостность данных в таблицах базы данных, но их трудно поддерживать, поскольку их трудно найти. Поскольку они выполняют все команды вставки, обновления или удаления из таблицы, они могут снизить производительность. Итак, у триггера есть различные преимущества и недостатки, которые мы обсудили ниже.

Преимущества триггера:

  • Триггеры легко кодируются.
  • Триггеры позволяют создавать основные элементы управления.
  • Триггеры можно использовать для вызова хранимых процедур и функций.
  • Триггеры полезны, когда вам нужно проверить входные данные или обновить данные в пакетах, а не в строках.
  • Вы можете использовать триггеры для обеспечения ссылочной целостности в базе данных. К сожалению, SQL Server не позволяет устанавливать ограничения между объектами в разных базах данных, но вы можете использовать триггеры для имитации поведения ограничений.
  • Триггеры полезны для запуска определенных событий всякий раз, когда данные добавляются, обновляются или удаляются. Это происходит при работе со сложными значениями столбца по умолчанию или при изменении данных из других таблиц.
  • Вы можете использовать внешний код в качестве триггеров с триггерами CLR. Этот тип триггера относится к методу сбора, написанному с использованием триггеров в .NET.
  • Можно вложить до 32 уровней триггеров. Триггеры считаются вложенными при выполнении действия и активации других триггеров.
  • Триггер включает повторение. Триггеры являются рекурсивными, если триггер в таблице выполняет действие, которое запускает другой экземпляр базовой таблицы. Это полезно при работе с самореферентными отношениями.

Недостатки триггера:

  • Установка рекурсивных триггеров сложнее, чем установка вложенных триггеров.
  • Если вы используете триггеры для обеспечения ссылочной целостности, имейте в виду, что пользователи с доступом ALTER или пользователи, которые видели триггер, могут отключить их. Чтобы избежать этого, вам может потребоваться проверить разрешения пользователей.
  • Триггеры должны быть хорошо задокументированы.
  • Триггеры добавляют избыточность операторам DML.
  • Многие вложенные триггеры могут быть очень сложными для устранения неполадок и решения проблем, требующих времени и ресурсов разработки.
  • Триггеры для BULK INSERTS не запускаются, если вы не включите параметр FIRE_TRIGGERS в оператор массовой вставки.

Классы триггеров SQL Server

В SQL Server существует две категории триггеров:

  • DDL (язык определения данных) — эта категория триггеров активируется событиями, изменяющими структуру, такими как создание, изменение или удаление таблицы, а также некоторыми событиями, связанными с сервером, такими как безопасность обновления или событие обновления статистики.
  • DML (язык модификации данных) — к этой категории относится большинство триггеров. В этом случае оператор изменения данных, который может быть оператором вставки, обновления или удаления в таблице или представлении, является инициирующим событием.

Триггеры DDL

Триггер DDL выполняет событие в командах Create, Alter или Drop в базе данных.

Пример:

  • Создать триггер вставки для таблицы с именем «Продажи»

//Вставка создания триггера

 создание триггера trigger_insert для продаж
после вставки
как
начинать
ПЕЧАТЬ 'ВЫ ВСТАВИЛИ СТРОКУ'
конец
 

//Для просмотра активации триггера

 вставить в значения Sales (9,4, '04-11-2012',15670.50, 'FALSE') 

  • Создать триггер обновления в таблице с именем «Магазины»

// Создание триггера обновления

 создание триггера trigger_update в магазинах
после обновления
как
начинать
ПЕЧАТЬ 'ВАША ЗАПИСЬ ОБНОВЛЕНА!'
конец
ВЫБЕРИТЕ * ОТ [dbo]. [Магазины]
 

//Чтобы просмотреть активацию триггера

 ОБНОВЛЕНИЕ Магазины, установите тип = 'A', где Store = 1
 

  • Создайте триггер удаления в таблице «Функции».

//Удалить создание триггера

 создать триггер trigger_delete для функций
после удаления
как
начинать
ПЕЧАТЬ 'ВАША ЗАПИСЬ БЫЛА УДАЛЕНА!'
конец
выберите * из [dbo].[Возможности]
 

//Для просмотра активации триггера

 удалите функции, где температура = '38,51'
 

Триггеры DML

Триггер DML выполняет событие в командах Insert, Update или Delete в таблице.

  • Создайте триггер создания для вашей базы данных.

//Создать создание триггера

 создать триггер create_trigger
в базе данных
после создания_таблицы
как
начинать
Распечатать «Таблица создана»
Конец
 

//Для просмотра активации триггера

 создайте таблицу sample_table (id int)
 
  • Измените триггер создания из вашей базы данных на триггер удаления.

//Изменение триггера создания на триггер удаления

 alter trigger create_trigger
в базе данных
после drop_table
как
начинать
Распечатать «Таблица удалена»
Конец
 

//Для просмотра активации триггера

 перетащите таблицу sample_table
 

  • Создайте триггер изменения для вашей базы данных.

//Создание триггера изменения

 создание триггера alter_trigger
в базе данных
после alter_table
как
начинать
Распечатать «Таблица изменена»
конец
 

//Для просмотра активации триггера

 изменить таблицу sample_table
изменить идентификатор столбца varchar (5)
 

Оставьте любой из ваших запросов в нашем сообществе SQL Server и начните обсуждение.

Расписание курсов

Утилита SQL Server Trigger (Как ее можно использовать?)

Утилита запуска SQL Server (как ее можно использовать?)

RelationalDBDesign

  • Карта сайта

Триггеры SQL-Server «Пред. След.»

  • Бизнес-правила
  • Блокировка транзакции
  • Изоляция транзакций — викторина
  • Проверка обработки ошибок
  • Взаимодействие с сервером
  • Назначение переменных использования
  • Ошибки вызова SQL
  • Функции SQL Server
  • Триггеры SQL-сервера
  • Тест триггеров SQL
  • Обеспечение соблюдения бизнес-правил
  • Создание триггеров — упражнение
  • Тестирование триггера SQLserver
  • Хранимые процедуры
  • Что такое SP
  • Обеспечение соблюдения бизнес-правил
  • Создание SP
  • Определяемый пользователем SP
  • Хранимые процедуры — упражнение
  • Процедуры модификации
  • Удаление хранимых процедур
  • Расширенная система SP
  • Обработка ошибок
  • Использование выходных параметров
  • Выполнение хранимых процедур
  • Тестирование хранимых процедур
  • Другое заключение SP
  • Хранимая процедура — Викторина
  • Доступ к удаленным данным
  • Сервер Enterprise Manager
  • Добавление удаленного входа

Урок 2 Что такое триггер?
Объектив Триггеры SQL Server и как их можно использовать

Триггер — это служебная программа SQL Server, которая вызывает событие срабатывает , когда данные в таблице вставляются, обновляются или удаляются. Триггеры запускаются в соответствии со спецификациями, сделанными программистом SQL Server.
Например, вы можете указать, что триггер будет срабатывать при обновлении столбца «Зарплата» в таблице «Сотрудники».

Триггеры и бизнес-правила

Триггеры — важный инструмент для обеспечения соблюдения бизнес-правил, поскольку их можно настроить на автоматическое срабатывание, когда потенциальные изменения в вашей таблице противоречат установленным бизнес-правилам.
Триггеры устанавливаются в базе данных, а не в конкретном приложении, что означает:

  1. Триггеры будут срабатывать независимо от того, какое приложение генерирует запрос, что увеличивает ваши возможности по обеспечению соблюдения бизнес-правил.
  2. При изменении бизнес-правила необходимо изменить триггер только один раз.

Триггеры и ошибки

Триггер не сработает, если запрашивающая инструкция Transact-SQL выдает ошибку, например первичный ключ или нарушение синтаксиса.
Вы можете использовать это ограничение для управления запуском триггеров. Например, вы можете указать, что будет возникать ошибка, когда значение столбца «Зарплата» в таблице «Сотрудники» превышает 100 000 долларов США. В этом случае триггер сработает, но никаких действий предпринято не будет.

Вложенные триггеры

Когда триггеры вложены в , один запускает другой и так далее. Триггеры могут иметь вложенность до 16 уровней. Функцию вложенности можно отключить или уменьшить количество уровней с помощью системной процедуры sp_configure .

Каскадные триггеры

Каскад — это серия обновлений или удалений, вызываемых триггером. Например, вы можете создать триггер, который срабатывает при удалении сотрудника из базы данных.
Однако, когда сотрудник удаляется, вы, вероятно, не хотите, чтобы его или ее информация сохранялась во всех других таблицах, содержащих идентификатор сотрудника. В этой ситуации триггер может выполнить каскад удалений, чтобы ни в одной таблице не осталось следов сотрудника.