Можно ли уведомлять меня, если «после вставки или обновления» останавливается работа?

dba.stackexchange https://dba.stackexchange.com/questions/6880

  •  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) Бранч, и поместите там отчеты, если это то, чего никогда не должно произойти.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top