Я не знаю, как создать триггер журнала - PullRequest
0 голосов
/ 29 октября 2018

Мне нужно создать триггер журнала после обновления, после вставки и перед удалением.

В таблице accounts_history у меня больше строк, чем в таблице счетов, и это меня смущает

Как написать этот триггер?

Я пытался это сделать, но у меня ничего не получилось. Так я создавал таблицы и последовательности.

Я новичок в Oracle и plsql

Извините, если я плохо объяснил свою проблему.

create table accounts (
  id number,
  name varchar2(32),
  amount number,
  date date
);

create sequnce acc_seq_id
  start wtih 1
  increment by 1
  nocache
  nocycle;

create table accounts_history (
  id          number
, old_name    varchar2(32)
, new_name    varchar2(32)
, old_amount  number
, new_amount  number
, change_date date
);

Мой триггер только после обновления

create or replace trigger after_update
after update
on accounts referencing new as new old as old
for each row

begin

iNSERT INTO account_history
(
id, 
name,
old_name,
amount,
old_amount,
date
)
values
(
 :old.id,
 :new.name,
 :old.old_name,
 :new.amount,
 :old.old_amount,
 sysdate
);
end;
/

Ошибка:

  SQL> show error
  Errors for TRIGGER AFTER_UPDATE:

  LINE/COL ERROR
  -------- --------------------------------------------------------------
   2/1   PL/SQL: SQL Statement ignored
   9/2   PL/SQL: ORA-01747: invalid user.table.column, table.column, or
         column specification

   13/2  PLS-00049: bad bind variable 'OLD.ID'
   14/2  PLS-00049: bad bind variable 'NEW.NAME'
   15/2  PLS-00049: bad bind variable 'OLD.OLD_NAME'
   16/2  PLS-00049: bad bind variable 'NEW.AMOUNT'
   17/2  PLS-00049: bad bind variable 'OLD.OLD_AMOUNT'
   SQL> 

1 Ответ

0 голосов
/ 29 октября 2018

Вставляемые значения берутся из таблицы ACCOUNTS, целевые столбцы - из таблицы ACCOUNT_HISTORY. Вы перепутали их, поэтому получаете ошибку ORA-01747. Попробуйте это:

create or replace trigger after_update
    after update on accounts 
    referencing new as new old as old    
   for each row
 begin
     INSERT INTO account_history
       (
    id, 
    new_name,
    old_name,
    new_amount,
    old_amount,
    change_date
)
values
(
     :old.id,
     :new.name,
     :old.name,
     :new.amount,
     :old.amount,
     sysdate
    );
End;
/
...