Как создать триггер для записи изменений для вставки, обновления, удаления для нескольких таблиц - PullRequest
0 голосов
/ 07 октября 2010

У меня есть две таблицы в моей базе данных. Это может увеличиться позже. Я хочу добавить другую таблицу Audit для отслеживания изменений в существующих двух таблицах. Я хочу отслеживать любые изменения, сделанные в любой из этих таблиц. Структура таблицы AUdit
ID
Table_Name
Field_Name
Old_Value
New_Value
Modified_By
Date_of_Modification

Так что теперь я хочу иметь один триггер для обеих таблиц, который может бытьуволен при вставке, обновлении или удалении любой из моих таблиц.Когда этот триггер срабатывает, я хочу вставить значения в Audit. При обновлении я хочу старое значение и новое значение. При вставке я хочу, чтобы старое значение было пустым, а новое - Inserted. При удалении я хочу старое значение, как старое.существующее значение и новое значение как удаленные.

1 Ответ

1 голос
/ 07 октября 2010

Я не совсем уверен, каков твой вопрос. Триггеры могут использовать ключевые слова: OLD и: NEW, например:

create trigger table1_trg
after insert or update or delete on table1
for each row
begin
   if :old.col1 is null and :new.col1 is not null
   or :old.col1 is not null and :new.col1 is null
   or :old.col1 != :new.col1 
   then
      insert into audit_table ...
   end if;

   -- Ditto for col2, col3, ...
end;

Не существует универсального способа сделать это, вам нужно будет иметь код для каждого столбца. Однако вы можете инкапсулировать логику следующим образом:

procedure log_col_change
   ( p_table_name varchar2
   , p_column_name varchar2
   , p_old_val varchar2
   , p_new_val varchar2
   )
is
begin
   if p_old_val is null and p_new_val is not null
   or p_old_val is not null and p_new_val is null
   or p_old_val != p_new_val 
   then
      insert into audit_table ...
   end if;
end;

-- Overloaded version to handles DATE columns without losing time component
procedure log_col_change
   ( p_table_name varchar2
   , p_column_name varchar2
   , p_old_val date
   , p_new_val date
   )
is
begin
   log_col_change (p_table_name, p_column_name
                  , to_char(p_old_val,'YYYY-MM-DD HH24:MI:SS')
                  , to_char(p_new_val,'YYYY-MM-DD HH24:MI:SS')
                  );
end;

Триггер тогда:

create trigger table1_trg
after insert or update or delete on table1
for each row
begin
   log_col_change ('MYTABLE', 'COL1', :old.col1, :new.col1);
   log_col_change ('MYTABLE', 'COL2', :old.col2, :new.col2);
   ... etc.
end;

NB. Лучше всего помещать процедуры в пакет.

...