Задача: сохранять информацию о всех изменения в определенной таблицы. Наиболее простое решение - создать таблицу, совпадающую по структуре с отслеживаемой и при каждом изменении писать в эту таблицу строку с обновленным состоянием измененной строки. Сделать это можно с помощью триггера, отслеживающего операции INSERT, UPDATE и DELETE.
Ниже приведен код триггера для исходной таблицы людей PERSONS таблицы изменений CHANGES_PERSONS вида:
CREATE TABLE PERSONS ( PERSON_ID INT NOT NULL IDENTITY PRIMARY KEY, SURNAME VARCHAR(150) NOT NULL, NAME VARCHAR(150) NOT NULL, OTCHESTVO VARCHAR(150) NOT NULL ) CREATE TABLE CHANGES_PERSONS ( CHANGE_ID_PERS int not null identity, CHANGE_DATE datetime not null default getdate(), CHANGE_TYPE varchar(10) not null, PERSON_ID INT NOT NULL, SURNAME VARCHAR(150) NOT NULL, NAME VARCHAR(150) NOT NULL, OTCHESTVO VARCHAR(150) NOT NULL )
--- ТРИГГЕР ОТСЛЕЖИВАЮЩИЙ ИЗМЕНЕНИЯ
create trigger dbo.changes_persons_trigger
on PERSONS FOR INSERT, UPDATE, DELETE NOT FOR REPLICATION
as
-- SET NOCOUNT ON добавлен чтобы не было лишних результатов выполнения операции
set NOCOUNT ON;
-- определеяем тип произошедших изменений INSERT,UPDATE, or DELETE
declare @change_type as varchar(10)
declare @count as int
set @change_type = 'inserted'
select @count = COUNT(*) FROM DELETED
if @count > 0
begin
set @change_type = 'deleted'
select @count = COUNT(*) from INSERTED
if @Count > 0
set @change_type = 'updated'
end
-- обработка удаления
if @change_type = 'deleted'
begin
insert into CHANGES_PERSONS(CHANGE_TYPE, PERSON_ID, SURNAME, NAME, OTCHESTVO) select 'deleted', PERSON_ID, SURNAME, NAME, OTCHESTVO from deleted
end
else
begin
-- триггер не различает вставку и удаление, так что добавим ручную обработку
-- обработка вставки
if @change_type = 'inserted'
begin
insert into HANGES_PERSONS(CHANGE_TYPE, PERSON_ID, SURNAME, NAME, OTCHESTVO) select 'inserted', PERSON_ID, SURNAME, NAME, OTCHESTVO from inserted
end
-- обработка обновления
else
begin
insert into HANGES_PERSONS(CHANGE_TYPE, PERSON_ID, SURNAME, NAME, OTCHESTVO) select 'updates', PERSON_ID, SURNAME, NAME, OTCHESTVO from inserted
end
end -- завершение if
-- завершение dbo.changes_persons
Дополнительно:
отлично. то-что надо.
Скажите, можно ли в триггере получить название процедуры, которая внесла изменения в таблицу. OBJECT_NAME(@@PROCID) - выдает название триггера, а нужно узнать, кем были сделаны изменения
Скажите, можно ли в триггере получить название процедуры, которая внесла изменения в таблицу.