Как узнать, какие записи были обновлены, удалены или вставлены в Oracle - PullRequest
0 голосов
/ 30 мая 2011

Я делаю LogTable, где я сохраняю данные, которые были изменены в RealTable.

Под данными я подразумеваю, что мне нужно восстановить значения :new и :old всей записи.Итак, у меня есть триггер, который реагирует, есть ли вставка, удаление или обновление.

Итак, мой вопрос: как узнать, какая запись была изменена и как восстановить ее содержимое?

пример:

create table t1(
    a integer,
    b integer
)

create table LogT1(
    new_a integer, 
    old_a integer,
    new_b integer,
    old_b integer
)

Допустим, на t1 есть запись со значениями a = 1, b = 2 и t1 получает обновление, поэтому запись меняет значения на a = 3, b = 4

Чтобы обновление активировало триггер, оно должно:

  1. Узнать, какая запись была изменена.
  2. Восстановить эту запись.
  3. Получить «до» и «после значений "a и b"
  4. Вставьте эти значения в LogT1 как old_a, new_a, old_b, new_b

, получив в результате вставку в LogT1 со значениями new_a = 3, old_a = 1, new_b = 4, old_b = 2

CREATE or REPLACE TRIGGER tr001
  AFTER INSERT OR UPDATE OR DELETE ON t1

DECLARE

    a integer;
    b integer;
    a2 integer;
    b2 integer;

BEGIN

    IF DELETING THEN 

        *Recover the row that changed* 

        *Then use that row*
        a2:= :new.a ;
        b2:= :new.b ;
        a:= :old.a ;
        b:= :old.b ;
        insert into LogT1 (new_a integer, old_a integer, new_b integer, old_b integer) 
values (a2,a,b2,b);

    END IF;

....

END tr001;

Я новичок в этом, поэтому мои самые искренние извинения, если мой вопрос не является правильным.

Ответы [ 4 ]

4 голосов
/ 30 мая 2011

Насколько я помню, вы можете объявить триггер как FOR EACH ROW, чтобы он срабатывал для каждой строки, которая была удалена | вставлена ​​| обновлена, тогда: new и: old содержат конкретные значения строки. Надеюсь, это поможет.

CREATE or REPLACE TRIGGER tr001 
  AFTER INSERT OR UPDATE OR DELETE 
  ON t1
  FOR EACH ROW
DECLARE
...
1 голос
/ 30 мая 2011

Если у вас есть 11g, вы можете использовать Flashback Data Archive , чтобы сделать это,

0 голосов
/ 30 мая 2011

Это какой-то PL / SQL, который я использую в проекте, чтобы делать в точности то, что вам нужно.

Я упростил свой скрипт (он выполнял некоторые другие функции):

create or replace trigger rtt.course_log
       after insert or update or delete
       on rtt.TRAINING_COURSE
       for each row

declare msg varchar2(255);

begin
        if updating then
           msg := 'updating course: ' ||  :new.name || 'at: ' || :new.updated_at;
        elsif inserting then
           msg := 'creating course: ' ||  :new.name || 'at: ' || :new.updated_at;
        elsif deleting then
           msg := 'deleting course: ' ||  :new.name || 'at: ' || :new.updated_at;
        end if;
        insert into rtt.TRAINING_LOG (message, created_at) values (msg, SYSDATE);
end;
0 голосов
/ 30 мая 2011

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

SELECT * FROM TABLE_NAME AS OF TIMESTAMP

(укажите время, когда записи требуются в качестве метки времени)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...