Обновление нескольких записей запускает триггер один раз - PullRequest
2 голосов
/ 02 ноября 2009

У меня есть таблица, в которой при обновлении одной записи триггер добавляет запись истории в другую. стол.

Когда я запускаю обновление нескольких записей в таблице, триггер не работает, поскольку он был реализован для работы только с одной записью, а триггер запускается только один раз для оператора, независимо от того, влияет ли он на несколько записей. Есть ли способ сделать эту работу?

Могу ли я использовать следующую проверку:

**if @@rowcount = 1** 

для того, чтобы обрабатывать отдельную запись так, как она обрабатывается сейчас, и в операторе else для обработки ее другим способом (чего я не знаю)?

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

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

Кто-нибудь может дать мне простой пример или руководство?

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 02 ноября 2009

Очень простой пример, не видя вашей текущей, точной логики триггера:

-- First update the datetime column for each record inserted
UPDATE t
SET t.DateField = GETDATE()
FROM UnderlyingTable t
    JOIN inserted i ON t.RecordId = t.RecordId

-- then insert history record for each record inserted
INSERT HistoryTable (DateCreated, RecordId, SomeOtherField)
SELECT GETDATE(), i.RecordId, i.SomeOtherField
FROM inserted i
0 голосов
/ 02 ноября 2009

Я нашел решение, как сделать так, чтобы оно учитывало несколько строк.

Сначала я меняю дату в каждой записи таблицы Table1 из таблицы INSERTED, в которой совпадают PK

UPDATE Table1 set status_changed_on = (SELECT CASE WHEN Table1.status is null THEN null ELSE @now END)
FROM INSERTED i
WHERE Table1.table1_id = i.table1_id

затем добавьте запись истории следующим образом:

INSERT INTO [History] ([table1_id ], [status_changed_on])
SELECT table1_id, @now 
FROM INSERTED

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

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

Спасибо !!!

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