Создать триггер в SQL Server

Я заблудился, когда хотел создать триггер, используя предопределенный «CREATE TRIGGER» SQL Server 2008 R2. Не могли бы вы дать мне прямую инструкцию SQL, которую я могу использовать для создания триггера, и сказать мне, как определить ПОСЛЕ, ДО и все такое?

Кроме того, как я могу узнать строки UPDATED/INSERTED/DELETED и использовать значения их столбцов для выполнения операций внутри триггера?


person raladin    schedule 29.07.2010    source источник
comment
@john: Продукт называется SQL Server, а не MSSQL. MSSQL легко спутать с MySQL. Кроме того, задавая вопрос по SQL Server, я предлагаю вам использовать тег sql-server. sql для общих вопросов о языке SQL.   -  person John Saunders    schedule 29.07.2010
comment
Хорошо, спасибо за заметку. Сделаю это.   -  person raladin    schedule 29.07.2010
comment
Ваш вопрос просто о том, как определить триггер, или как написать триггер, который вы можете использовать для работы с затронутыми строками? Если позже, то вам следует перефразировать свой вопрос.   -  person Thomas    schedule 29.07.2010


Ответы (3)


Базы данных ориентированы на множество, и триггеры ничем не отличаются. Триггер срабатывает при выполнении данной операции, и эта операция может повлиять на несколько строк. Таким образом, вопрос "Say I want to know the Primary Key of that row" является неправильным. Может быть вставлено несколько строк.

SQL Server предоставляет две специальные таблицы для триггеров AFTER с именами inserted и deleted, которые представляют строки, которые были вставлены или удалены действием, и структурированы идентично затрагиваемой таблице. Триггер обновления может заполнять как inserted, так и deleted, тогда как триггер вставки заполняет только таблицу inserted.

Из комментариев:

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

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

Для справки: Создать триггер

person Thomas    schedule 29.07.2010
comment
А потом вызывать эту процедуру из триггера? Это то, что вы имели ввиду? Но разве процедуры почтовой системы sql недостаточно, чтобы обработать это в триггере? или я должен создать процедуру, которая вызывает эту системную процедуру, а затем вызывать эту процедуру в триггере? - person raladin; 29.07.2010
comment
@johnshaddad - Нет. Я бы не стал выполнять операции с электронной почтой из триггера. Вместо этого я бы хотел, чтобы ваш вызывающий код использовал хранимую процедуру вместо того, чтобы напрямую работать с таблицей. - person Thomas; 29.07.2010
comment
Когда вы сказали, что может быть вставлено несколько строк. разве это не срабатывает триггер несколько раз? Или как? Не могли бы вы объяснить, как я буду зацикливаться в таком случае? - person raladin; 29.07.2010
comment
@johnshaddad - триггер срабатывает один раз для каждого оператора или операции. Например, предположим, что у вас есть запрос Insert Table(...) Select ... From OtherTable, который вставляет 100 строк. Триггер сработает только один раз. Специальная таблица inserted будет иметь 100 строк, которые вы можете циклически перемещать с помощью чего-то вроде курсора или использовать в других операторах SQL (например, Insert LogTable(...) Select ... From inserted). - person Thomas; 29.07.2010
comment
@johnshaddad - Теперь, если вместо одного вызова Insert Table(...) Select ... From OtherTable, предположим, вы выполняете оператор 100 Insert, в который каждый раз вставляете одну строку. Каждый оператор запускает триггер один раз, и таблица inserted будет содержать одну строку каждый раз, когда он срабатывает. Однако при написании триггера вы должны предполагать, что кто-то может вставить, обновить или удалить таблицу, используя операцию набора, которая повлияет на несколько строк. - person Thomas; 29.07.2010
comment
Спасибо! Я принял это во внимание и создал в своем триггере курсор, который вызывает процедуру отправки соответствующего уведомления для каждой строки в таблице INSERTED. Работаю как шарм xD - person raladin; 29.07.2010

Основной синтаксис

CREATE TRIGGER YourTriggerName ON dbo.YourTable
FOR|AFTER INSERT, UPDATE, DELETE
AS
BEGIN
     /*Put what ever you want here*/
     UPDATE AnotherTable
          SET SomeColumn = AnotherColumn
     FROM inserted | deleted
END
GO
person mrdenny    schedule 29.07.2010

Триггер — это процесс, основанный на событии, который «запускается» после того, как таблица каким-либо образом изменяется. Это будет DELETE, UPDATE, INSERT и так далее. Ваш синтаксис BEFORE и AFTER будет определять, следует ли запускать триггер до или после фиксации события.

Это короткая версия. Посетите MSDN.

person Community    schedule 29.07.2010
comment
Да, я знаком с триггерами в MySQL, но не в MSSQL, поэтому подумал, что есть другой способ реализации. Спасибо! - person raladin; 29.07.2010
comment
Но как узнать, какая строка обновляется? Скажем, я хочу узнать первичный ключ этой строки, как это сделать? Что-то вроде отправки электронного письма после добавления нового элемента, но получатель электронной почты будет определяться на основе значения во второй таблице, где идентификатор внешнего ключа находится в первой таблице (которая имеет триггер) - person raladin; 29.07.2010
comment
Комментарий mrdenny в ответ на ответ Джоэла Коегоорна - хорошее резюме. - person ; 29.07.2010