Скрипт SqlPlus для обновления данных и регистрации значений обновления в CLOB

#sql #oracle #shell #plsql #sqlplus

Вопрос:

Я создаю сценарий оболочки, который использует sqlplus для обновления данных в базе данных Oracle.

У меня есть такая таблица пользователей.

идентификатор пользователя Имя statut
1 ааа 1
2 ввв 1

и еще одна таблица user_log, подобная этой.

Дата nb_rows_affected Подробные сведения

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

Я приведу вам пример, допустим, у нас есть вышеуказанная информация в таблице пользователей, и мы хотим обновить имя и статус пользователя aaa до user.name == ccc и его статус для пользователя.статус=2, поэтому я сделаю это так

 update user set statut = 2 and name = 'ccc' where id_user = 1 
 

Я хочу, чтобы автоматически после обновления у нас была следующая информация в таблице журнала

 date = current_date 
nbrow_affected = 1 
details : new values (statut = 2 and name = 'ccc') old values (statut = 1 and name = 'aaa') for id_user= 1
 

Я искал его, единственный способ сделать это-с помощью триггеров при обновлении таблицы пользователей, потому что он может использовать new.name и old.name заявление, но я застрял на том, как его правильно реализовать

Как я могу это сделать?

Ответ №1:

Вы можете создать триггер, который опрашивает каждый столбец. Это многословно, но вы также можете написать процедуру для автоматической генерации этого для вас из USER_TAB_COLUMNS

Код триггера будет выглядеть примерно так:

 declare
  c clob;
begin
  if updating(col1) then c := c || 'old='||:old.col1||',new='||:new.col1; end if;
  if updating(col2) then c := c || 'old='||:old.col2||',new='||:new.col2; end if;
  if updating(col3) then c := c || 'old='||:old.col3||',new='||:new.col3; end if;
  if updating(col4) then c := c || 'old='||:old.col4||',new='||:new.col4; end if;
  ...
  ...
end;  
 

И в конце этого вы сохраните букву » с » в своей таблице регистрации