Как настроить аудит на основе триггера?

У меня есть таблица Employee:

CREATE TABLE [dbo].[Employee]
(
    [EmployeeCode] [int] NOT NULL,
    [FirstName] [varchar](50) NULL,
    [LastName] [varchar](50) NULL,
    [Email] [varchar](50) NULL,
    [Position] [varchar](30) NULL
)

Я хочу регистрировать изменения в таблице Employee_Audit каждый раз, когда происходит изменение в Position (вместе с Old Position, New Position и Timestamp) в таблице Employee.

CREATE TABLE [dbo].[Employee_Audit]
(
    [EmployeeCode] [int] NOT NULL,
    [FirstName] [varchar](50) NULL,
    [LastName] [varchar](50) NULL,
    [Email] [varchar](50) NULL,
    [PositionOld] [varchar](30) NULL,
    [PositionNew] [varchar](30) NULL,
    [Date] [datetime] NULL
 )

Как мне этого добиться?


person Victor McIntyre    schedule 06.07.2020    source источник
comment
Есть много способов сделать это, что показало вам ваше исследование?   -  person Dale K    schedule 06.07.2020


Ответы (2)


В дополнение к упомянутому параметру триггера @marc_s, если вы хотите не только учитывать позицию, но и учитывать аудит всех изменений столбца, нижеприведенные параметры позволяют вам выполнять аудит без какой-либо специальной необходимости программирования. Вы можете увидеть, подходит ли он для ваших нужд.

person Venkataraman R    schedule 06.07.2020
comment
Спасибо @Venkataraman R. Хотя я выбрал вариант «Триггер», ваш ответ тоже был полезен. :-) - person Victor McIntyre; 07.07.2020

В основном вам нужен триггер UPDATE, который проверяет, изменилось ли значение Position, и если да, то записывает подробности в Employee_Audit:

CREATE OR REPLACE trgEmployeeUpdate
ON dbo.Employee 
AFTER UPDATE 
AS
BEGIN
    -- based on the Inserted and Deleted pseudo tables, join the rows
    -- that were updated and look for changes in "Position"
    INSERT INTO dbo.Employee_Audit (EmployeeCode, FirstName, LastName, Email, 
                                    PositionOld, PositionNew, [Date])
        SELECT
            i.EmployeeCode, i.FirstName, i.LastName, i.Email,
            d.Position, i.Position, SYSDATETIME()
        FROM
            Inserted i
        INNER JOIN
            Deleted d ON i.EmployeeCode = d.EmployeeCode
        WHERE
            i.Position <> d.Position    -- Position has changed
END
person marc_s    schedule 06.07.2020
comment
Спасибо @marc_s. Это разрешило мой запрос. :-) - person Victor McIntyre; 07.07.2020