Можно ли уведомлять меня, если «после вставки или обновления» останавливается работа?
-
16-10-2019 - |
Вопрос
На прошлой неделе я нашел свой after insert or update trigger
не работал. После того, как я отключил и включил его, он снова начал работать.
Я еще не знаю, почему это перестало работать. Есть ли способ справиться с этим? Потому что этот триггер регистрирует стоимость ежедневных работ и используется для целей отчета. Если этот триггер погиб через несколько дней без моего уведомления или ошибки, я буду в горячей воде.
Я использую Oracle 10G, доступ к DB, используя SqlDeveloper
My Trigger
create or replace
TRIGGER MASTER.INSTANCE_STEP_TRG
AFTER INSERT OR UPDATE OF SYSID,STEP_ID,INSTANCE_ID,PARENT_STEP_ID ON MASTER.WF_INSTANCE_STEP
REFERENCING OLD AS old NEW AS new
FOR EACH ROW
WHEN (new.sysid > 0)
declare
stepSysid number;
crCode varchar(50);
crDate date;
step_id number;
BEGIN
step_id := :new.step_id;
select ss.sysid into stepSysid from TEMPLATE.wf_step ws
inner join TEMPLATE.step_stage ss on ss.sysid=ws.stage_id
where ws.sysid= step_id;
if ( stepSysid>0) then
insert into MASTER.fact_cr_progress values(0,:new.instance_id,stepSysid,:new.create_dt);
end if;
dbms_output.enable(10000);
dbms_output.put_line('start print');
END;
Решение
Триггер не может просто перестать работать.
Триггер может быть отключен. Триггер можно сбросить. Триггер будет сделан недействительным, если DDL будет выполнен с одним из объектов, которые он ссылается, но он все равно будет выполнен, если будет выполнен оператор запуска. Если триггер не удается успешно перекомпилировать, оператор запуска получит ошибку
ORA-04098: trigger ' MASTER.INSTANCE_STEP_TRG' is invalid and failed re-validation
Также кажется возможным, что триггер работал правильно, как заявлено, но не так, как вы намеревались. Например, возможно, что новый. Сисид был не больше 0 (помните, что NULL не больше 0), вызывая WHEN
пункт не будет встречен. Возможно, ваш SELECT
оператор вернул значение меньше или равно 0, что вызывает у вашего INSERT
нельзя казнить. Если TEMPLATE.wf_step
или же TEMPLATE.step_stage
имеет колонку STEP_ID
, WHERE
пункт
where ws.sysid= step_id;
будет интерпретировать STEP_ID
Как столбец в таблице, не ваша локальная переменная STEP_ID
. Анкет Одна из причин, по которой разработчики PL/SQL обычно добавляют префиксы к локальным переменным (т.е. L_STEP_ID
скорее, чем STEP_ID
) - непреднамеренно использовать имя, которое также используется столбцом в таблице, поскольку эти проблемы с разрешением с масштабами, как известно, трудно отладить.
Другие советы
Вероятно, это зависит от того, почему триггер «перестает работать».
Если это запускается, но не подходит к завершению, вы можете поставить что -то, чтобы вызвать сообщение в EXCEPTION
блокировать.
Если бы он был полностью отключен, вам придется найти какую -то характеристику, которая верна, когда она работает (например, у меня есть несколько триггеров, которые заполняют своего рода материализованный взгляд, который трудно вычислить на лету. У меня есть задание Cron, которая проверяет, чтобы увидеть Когда самая последняя запись в этой таблице, и если она слишком старая, она сообщает об этом). Если у вас нет чего -то очевидного, у вас всегда может быть таблица, которая только для отслеживания, когда триггеры пройдут в последний раз, и обновить ее с текущим временем.
Конечно, ни один из них не помогает делу, которое упомянул Джастин Кейв, где команды неверно истолковываются из -за разрешения имен переменных. Вы могли бы положить else
на if ( stepSysid>0)
Бранч, и поместите там отчеты, если это то, чего никогда не должно произойти.