Вставить триггер на SQL Server для истории изменений/аудита

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

Итак, вторая таблица (Bugs_Shadow) создаст новую запись вместе с первой (Bugs), а затем я смогу обновить проблему в таблице 1, когда кто-то попытается исправить. Когда нажимается обновление, я хочу, чтобы оно добавляло строку обновления в целом во вторую таблицу, но также сохраняло исходную запись. Таким образом, всякий раз, когда вносятся изменения, создается новая запись в таблице 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-й, тогда как я хочу, чтобы она создала новую запись, которая идентична, за исключением изменений сделанный пользователем.

Надеюсь, там есть какая-то помощь. Это моя первая попытка триггеров, и мне потребовалось некоторое время, чтобы добраться до этой стадии.

Спасибо


person Phil Adams    schedule 08.01.2017    source источник


Ответы (1)


Вам нужно триггеры здесь:

  • Один после вставки в одну таблицу, чтобы вставить ее в другую
  • Одно обновление before в одной таблице, чтобы вставить его в другую

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 не поддерживает триггеры before, поэтому указанное выше неверно. Вы можете использовать триггер INSTEAD. С триггером INSTEAD выполняется только триггер, а не исходный оператор. Итак, что вы должны сделать в этом триггере, так это вставить старое значение в одну таблицу и обновить другую таблицу.

Для получения дополнительной информации см. этот вопрос: Как можно Я делаю триггер BEFORE UPDATED с сервером sql?

Там также есть несколько ответов с указанием альтернативных решений.

person Kenneth    schedule 08.01.2017
comment
Спасибо за быстрый ответ. Однако при этом я получаю следующую ошибку: SQL80001: неправильный синтаксис рядом с «ДО». Есть идеи? - person Phil Adams; 09.01.2017
comment
Похоже, он ожидает «ПОСЛЕ», а не «ДО» - person Phil Adams; 09.01.2017
comment
Плохо, MS SQL не поддерживает триггеры BEFORE. Смотрите мой обновленный ответ - person Kenneth; 09.01.2017