Вставьте триггер на SQL Server для истории изменений / аудита
У меня есть две таблицы в моем приложении (я пытаюсь создать трекер ошибок). Один, к которому я могу добавить запись / проблему, а другой - для истории проблемы.
Итак, вторая (Bugs_Shadow) таблица создаст новую запись вместе с первой (Bugs), а затем я могу обновить проблему в таблице 1, когда кто-то попытался исправить. Когда щелкают по обновлению, я хочу добавить строку обновления в целом во 2-ю таблицу, но также сохранить исходную запись. Таким образом, всякий раз, когда вносится изменение, он создает новую запись в таблице Bugs_Shadow. Надеюсь это имеет смысл?
Я создал этот триггер:
CREATE TRIGGER [tr_Bugs_Insert]
ON [dbo].[Bugs]
AFTER UPDATE, INSERT
AS
BEGIN
INSERT INTO Bugs_Shadow (BugID, [User], Date, Subject, Description, [Source Code], [Current State])
SELECT BugID, [User], Date, Subject, Description, [Source Code], [Current State]
FROM Bugs
END
GO
Он работает настолько, что создает идентичную запись во 2-й таблице, но когда я обновляю запись в 1-й таблице, он делает то же самое во 2-й таблице, тогда как я хочу, чтобы она создала новую запись, идентичную кроме изменений сделано пользователем.
Надеюсь, там есть какая-то помощь. Это моя первая попытка триггеров, и мне потребовалось некоторое время, чтобы добраться до этой стадии.
Спасибо
1 ответ
Вам нужно триггеры здесь:
- Один после вставки в одну таблицу, чтобы вставить его в другой
- Один перед обновлением в одной таблице, чтобы вставить его в другую
CREATE TRIGGER [tr_Bugs_Insert]
ON [dbo].[Bugs]
AFTER INSERT
AS
BEGIN
INSERT INTO Bugs_Shadow (BugID, [User], Date, Subject, Description, [Source Code], [Current State])
SELECT BugID, [User], Date, Subject, Description, [Source Code], [Current State]
FROM Bugs
END
GO
CREATE TRIGGER [tr_Bugs_Update]
ON [dbo].[Bugs]
BEFORE UPDATE
AS
BEGIN
INSERT INTO Bugs_Shadow (BugID, [User], Date, Subject, Description, [Source Code], [Current State])
SELECT BugID, [User], Date, Subject, Description, [Source Code], [Current State]
FROM Bugs
END
РЕДАКТИРОВАТЬ
MS SQL не поддерживает до запуска триггеры, поэтому вышеупомянутое недопустимо. Вы могли бы использовать INSTEAD
спусковой крючок. С INSTEAD
Триггер, только триггер выполняется, а не исходный оператор. Итак, что вы должны сделать в этом триггере, это вставить старое значение в одну таблицу и обновить другую таблицу.
Для получения дополнительной информации см. Этот вопрос: Как я могу сделать триггер ДО ОБНОВЛЕНИЯ с SQL Server?
Там также есть несколько ответов, где указаны альтернативные решения.