2017-01-08 2 views
0

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

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

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

Благодаря

ответ

0

Вы должны триггеры здесь:

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

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 

EDIT

MS SQL не поддерживает, прежде чем триггеры, так что выше, не является действительным. Вы можете использовать триггер INSTEAD. С триггером INSTEAD запускается только триггер, а не исходный оператор. Итак, что вы должны сделать в этом триггере, вставьте старое значение в одну таблицу и обновите другую таблицу.

Для получения дополнительной информации см этот вопрос: How can I do a BEFORE UPDATED trigger with sql server?

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

+0

Спасибо за быстрый ответ. Однако с этим я получаю следующую ошибку: SQL80001: неправильный синтаксис рядом с «ПЕРЕД». Есть идеи? –

+0

Ожидается, что «ПОСЛЕ», а не «ПЕРЕД» –

+0

Мой плохой, MS SQL не поддерживает триггеры BEFORE. См. Мой обновленный ответ – Kenneth