Запрос SQL Update вызывает две строки в триггере - PullRequest
3 голосов
/ 20 декабря 2010

Я использую SQL Server 2005 и имею следующий вопрос:

На table A у меня есть триггер, который отслеживает любую вставку / обновление / удаление к нему.Отслеживаемые записи вставляются в таблицу аудита (aAudit).Когда я запускаю обновление для A, я вижу две строки в таблице аудита для каждого обновления, что не является тем, что я ожидаю.Вот триггер, который я определил:

ALTER TRIGGER [ATrigger] ON [dbo].[A]
FOR INSERT, UPDATE, DELETE
AS
INSERT INTO [dbo].[aAudit]
([BusinessDate], [DataTypeId], [BookId], [Version], [DelFlag], [AuditDate], [ExtStatus])
SELECT [BusinessDate], [DataTypeId], [BookId], [Version], 'N', getDate(), 0
FROM inserted

INSERT INTO [dbo].[aAudit]
([BusinessDate], [DataTypeId], [BookId], [Version], [DelFlag], [AuditDate], [ExtStatus])
SELECT [BusinessDate], [DataTypeId], [BookId], [Version], 'Y', getDate(), 0
FROM deleted

Почему приведенный выше триггер приводит к одной строке с DelFlag = 'Y' и одной строке с DelFalg = 'N' в таблице аудита?

Спасибоза то, что взглянул на мой вопрос.

Викрам

Ответы [ 2 ]

6 голосов
/ 20 декабря 2010

За кулисами ОБНОВЛЕНИЕ рассматривается как УДАЛИТЬ старую строку и ВСТАВИТЬ новую строку.Поэтому, когда вы делаете обновление, наборы записей INSERTED и DELETED содержат данные.

Вот почему две строки поступают в вашу таблицу аудита из оператора UPDATE.

4 голосов
/ 20 декабря 2010

Чтобы разделить три операции INSERT, UPDATE, DELETE, вам необходимо выполнить дополнительные проверки:

ALTER TRIGGER [ATrigger] ON [dbo].[A]
FOR INSERT, UPDATE, DELETE
AS
   -- those are true INSERTs - the (ID) as primary key is *not* present in the "Deleted" table
   INSERT INTO [dbo].[aAudit]([BusinessDate], [DataTypeId], [BookId], [Version], [DelFlag], [AuditDate], [ExtStatus])
      SELECT [BusinessDate], [DataTypeId], [BookId], [Version], 'N', getDate(), 0
      FROM inserted 
      WHERE (id) NOT IN (SELECT DISTINCT (id) FROM DELETED)

   -- those are true DELETEs - the (ID) as primary key is *not* present in the "Inserted" table
   INSERT INTO [dbo].[aAudit]([BusinessDate], [DataTypeId], [BookId], [Version], [DelFlag], [AuditDate], [ExtStatus])
      SELECT [BusinessDate], [DataTypeId], [BookId], [Version], 'Y', getDate(), 0
      FROM deleted
      WHERE (id) NOT IN (SELECT DISTINCT (id) FROM INSERTED)

   -- those are the UPDATEs - the (ID) as primary key is present in both the "Inserted" and "Deleted" table
   INSERT INTO [dbo].[aAudit]([BusinessDate], [DataTypeId], [BookId], [Version], [DelFlag], [AuditDate], [ExtStatus])
      SELECT [BusinessDate], [DataTypeId], [BookId], [Version], 'N', getDate(), 0
      FROM Inserted i
      INNER JOIN Deleted d on i.ID = d.ID
...