Инициирующее событие вызывается только один раз для БД Microsoft SQL Server 2005, если обновлено более одной строки? - PullRequest
2 голосов
/ 19 марта 2009

У меня есть таблица MyTable с триггером, определенным так:

ALTER TRIGGER [MyTableInsertDeleteUpdate] 
  ON  [dbo].[MyTable]
 AFTER  INSERT,DELETE,UPDATE
AS 
DECLARE @id int;
BEGIN
   SELECT @id = ins.id FROM inserted ins;
   IF (@id IS NOT NULL)
   BEGIN
      -- insert a new record to audit table
      PRINT 'inserted/updated id: ' + CAST(@id AS VARCHAR);
   END
END

Я понимаю, что если обновляется более одной строки, как это,

UPDATE MyTable SET name = 'test rows' WHERE id in (1, 2, 3);

тигр вызывается только один раз, и обновляется только первый из [вставлен]. На самом деле, [вставлено] может иметь более одной строки (3 в этом случае, если существуют идентификаторы 1, 2,3). Другими словами, триггер не срабатывает в каждой строке. Это верно?

Я использую Microsoft SQL Server 2005.

Ответы [ 3 ]

6 голосов
/ 19 марта 2009

Да, триггер срабатывает один раз для каждого оператора (не один раз для строки), который вносит изменения, на которые вы подписываетесь. Он даже выстрелит, если не затронут ряды.

http://msdn.microsoft.com/en-us/library/ms189799(SQL.90).aspx

2 голосов
/ 19 марта 2009

Как сказал Ходзё, ваш триггер будет срабатывать один раз за оператор, а не один раз за затронутую строку. Это отличается от баз данных, таких как Interbase и Firebird, и бросил меня, когда я впервые начал использовать SQL Server.

Весь смысл вставленных и удаленных «виртуальных» таблиц заключается в том, что события основаны на SET-записях, а не на строках.

Существует множество учебных пособий, посвященных написанию sql для обработки вставленных / удаленных таблиц, но остерегайтесь совмещенных таблиц. Я видел более пары так называемых учебных пособий, которые были только что скопированы / вставлены с другой платформы базы данных и фактически не работают в SQL Server, как они утверждают (один из лучших хитов для «примера триггера SQL Server»). в Google это совершенно неправильно для операторов UPDATE).

Это - разумное введение в триггеры и концепции, необходимые для понимания вставленных и удаленных таблиц, с объяснением того, почему вы пропустите события в своем собственном примере. Сами документы Microsoft будут достаточно полезны, когда вы преодолеете их унылую, безжизненную структуру и стиль письма.

0 голосов
/ 19 марта 2009

Чтобы вставить записи в таблицу аудита из вставки, вы должны сделать что-то вроде этого в триггере:

insert auditable (field1, field2, insert_date, insertedBy)
select field1, field2, getdate(), user_Name() from inserted 

Не надо дурачиться с установочными переменными, просто вставка, основанная на выбранной характеристике.

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

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