ошибка в триггере журнала перед удалением, я не могу найти ошибку - PullRequest
0 голосов
/ 30 октября 2018

Где ошибка, мне кажется, хорошо, но я получаю ошибку.

Я пытался, и это ссылается на старый как старый, новый как новый.

Возможно ошибка в переменных.

SQL> create or replace trigger before_delete
      2         before delete
      3     on accounts
      4  declare 
      5     v_username varchar2(20);
      6   begin
      7     select user into v_username
      8     from dual;
      9     insert into accounts_history
     10     (
     11         id, 
     12             new_name,
     13             old_name,
     14             new_amount,
     15             old_amount,
     16             change_date,
     17         delted_by
     18     )
     19     values
     20     (      
     21         :old.acc_id
     22         :old.acc_name
     23         :old.acc_name
     24         :old.acc_amount
     25         :old.acc_amount
     26         sysdate,
     27         v_username
     28   );
     29   end;
     30   /
        insert into accounts_history
            *
    ERROR at line 9:
    ORA-04082: NEW or OLD references not allowed in table level triggers

1 Ответ

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

Ошибка кажется довольно очевидной - у вас есть триггер уровня оператора, а не триггер уровня строки (без for each row предложения), и вы не можете использовать старые / новые псевдозаписи на уровне оператора .

Так как это действительно то, чего вы хотите, вам нужно добавить это предложение:

create or replace trigger before_delete
before delete
on accounts
for each row
begin
    insert into accounts_history
    (
        id,
        new_name,
        old_name,
        new_amount,
        old_amount,
        change_date,
        delted_by
    )
    values
    (
        :old.acc_id,
        :old.acc_name,
        :old.acc_name,
        :old.acc_amount,
        :old.acc_amount,
        sysdate,
        user
   );
end;
/

Вам не нужно запрашивать из dual, чтобы получить user в переменную, вы можете назначить его напрямую; но вам вообще не нужна эта переменная; Вы можете ссылаться на user call непосредственно в предложении values.

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