Передача новых / старых параметров в таблицы аудита?

Насколько я понимаю, таблицы аудита - это своего рода таблицы отслеживания (т.е. для фиксации изменений в базовой таблице).

Как INSERT / UPDATE op работает со старыми и новыми значениями? Не знаю, как это кодировать

Мне нужно записать старые и новые значения AddressLine1 FROM Person.Address

Это все, что у меня есть:

USE AdventureWorks2012;
GO

    -- AL1 is AddressLine1
-- also what about primary key???
CREATE TABLE AuditTable
(
    AL1Old      nvarchar(60)    not null,
    AL1New      nvarchar(60)    not null,
);
GO

-- should I update AuditTable there? 
-- I don't know how to insert Old and New value by trigger...
CREATE TRIGGER triggy
ON Person.Address
AFTER INSERT, UPDATE 
AS
-- ???
GO

person Bartłomiej Sobieszek    schedule 10.05.2014    source источник
comment
Разве вам не нужна временная метка чего-либо в вашей таблице аудита? Начните думать о том, что вам нужно из этой таблицы аудита, и расскажите нам.   -  person juergen d    schedule 11.05.2014


Ответы (1)


Если вы хотите вставить старые и новые данные в триггер, это будет только работать в триггере UPDATE - очевидно, что триггер INSERT не имеет никаких «старых» данных.

По сути, вам нужно получить старые данные из псевдотаблицы Deleted, а новые данные из псевдотаблицы Inserted.

Также: имейте в виду, что триггер вызывается один раз для каждого оператора, и обе псевдотаблицы могут (и будут!) Содержать несколько строк - поэтому запрограммируйте свой триггер соответствующим образом.

Чтобы обработать столбец Addressline1 - попробуйте что-то вроде этого (и да, я бы также рекомендовал включить первичный ключ, чтобы определить, для какой строки эти данные!)

-- AL1 is AddressLine1
-- also what about primary key???
CREATE TABLE AuditTable
(
    PrimaryKey INT NOT NULL,
    AL1Old      nvarchar(60)    not null,
    AL1New      nvarchar(60)    not null,
);
GO

-- I don't know how to insert Old and New value by trigger...
CREATE TRIGGER addressUpdateTrigger
ON Person.Address
AFTER UPDATE 
AS
    INSERT INTO dbo.AuditTable(PrimaryKey, AL1Old, AL1New)
       SELECT
          Inserted.AddressID,      -- primary key
          Deleted.AddressLine1,    -- old data
          Inserted.AddressLine1    -- new data
       FROM 
          Inserted
       INNER JOIN
          Deleted on Inserted.AddressID = Deleted.AddressID

GO
person marc_s    schedule 10.05.2014
comment
Божественный ответ, СПАСИБО! - person Bartłomiej Sobieszek; 11.05.2014