#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;
И в конце этого вы сохраните букву » с » в своей таблице регистрации