Как вызвать / вызвать последовательность внутри триггера - PullRequest
0 голосов
/ 28 ноября 2018

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

create or replace Trigger PVFC_audit
after insert or delete or update on customer
for each row 
declare
v_user varchar2(20);
eventlog_id_go number;
v_date date;
v_time timestamp;
act_done varchar2(20) := case when updating then 'Update' when deleting then 'Delete' else 'Insert' end;
begin
IF eventlog_id IS NULL THEN  <--- eventlog_id is the actual column in my eventlogs table
SELECT eventlog_id_seq.NEXTVAL , user, To_Char(sysdate,'DD/MON/YYY'), To_char(CURRENT_TIMESTAMP,'HH12:MI:SS')
INTO eventlog_id_go, v_user, v_date, v_time from dual;
END IF;
if inserting then
    insert into eventlogs(eventlog_id, user_name, date_done, time_done, action_done, object_name)
    values (eventlog_id_go, v_user, v_date, v_time, act_done , 'customer');
elsif deleting then
    insert into eventlogs(eventlog_id, user_name, date_done, time_done, action_done, object_name)
    values (eventlog_id_go, v_user, v_date, v_time, act_done,'customer');
elsif updating then
    insert into eventlogs(eventlog_id, user_name, date_done, time_done, action_done, object_name)
    values (eventlog_id_go, v_user, v_date, v_time, act_done ,'customer');
end if;
end;

----- Ниже приведена последовательность, которую я создал -----

CREATE SEQUENCE  "SYSTEM"."EVENTLOG_ID_SEQ"  
MINVALUE 1 
MAXVALUE 9999999999999999999999999999 
INCREMENT BY 1 
START WITH 1 
CACHE 20 
NOORDER  
NOCYCLE ;

Ошибка (13,4): PLS-00201: идентификатор 'EVENTLOG_ID'должен быть объявлен

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

eventlog_id - это столбец из другой таблицы с именем eventlogs

Таким образом, вы не можете ссылаться на него в триггере: триггер видит только столбцы таблицы, которой он принадлежит.Решением является просто заполнение столбца eventlog_id в операторе INSERT.

Кстати, у вашего триггера много дубликатов.Вы можете очень сильно упростить:

create or replace Trigger PVFC_audit
after insert or delete or update on customer
for each row 
declare
    act_done varchar2(20) := case when updating then 'Update' when deleting then 'Delete' else 'Insert' end;
begin

    if inserting then
        act_done := 'INSERT';
    elsif deleting then
        act_done := 'DELETE';
    elsif updating then
        act_done := 'UPDATE';
    end if;
    insert into eventlogs(eventlog_id, user_name, date_done, time_done, action_done, object_name)
    values (eventlog_id_seq.NEXTVAL , user, To_Char(sysdate,'DD/MON/YYY'), To_char(CURRENT_TIMESTAMP,'HH12:MI:SS')
    , act_done ,'customer');

end;

Не уверен, почему вы заполняете date_done и time_done как строки.Было бы разумнее использовать правильные типы данных.

    insert into eventlogs(eventlog_id, user_name, date_done, time_done, action_done, object_name)
    values (eventlog_id_seq.NEXTVAL , user, trunc(sysdate), CURRENT_TIMESTAMP
    , act_done ,'customer');

Если в EVENTLOGS эти столбцы определены как VARCHAR2, то это почти наверняка ошибка модели данных, которая в какой-то момент доставит вам горе.

0 голосов
/ 28 ноября 2018

Yo нужно указать псевдозаписей старое / новое значение

IF :OLD.eventlog_id IS NULL THEN 

или

IF :NEW.eventlog_id IS NULL THEN
...