Вставьте триггер на 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?

Там также есть несколько ответов, где указаны альтернативные решения.

Другие вопросы по тегам