Es posible para mí para ser notificado si 'después de desencadenador insert o update' deja de funcionar?

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

  •  16-10-2019
  •  | 
  •  

Pregunta

La semana pasada, me encontré a mi after insert or update trigger no estaba trabajando.Después he desactivado y activado, se comenzó a trabajar de nuevo.

Todavía no sé por qué dejó de trabajar.Es allí cualquier manera de lidiar con esto?Porque este disparador es registrar el valor del trabajo diario, y se utiliza para los informes.Si esta activación se agota en pocos días sin mi previo aviso o de error, voy a estar en el agua caliente.

Estoy utilizando Oracle 10g, acceso a la base de datos mediante el uso de 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;
¿Fue útil?

Solución

Un desencadenante no puede simplemente dejar de funcionar.

Se puede deshabilitar un disparador. Se puede dejar caer un gatillo. Un disparador se hará inválido si DDL se realiza a uno de los objetos a los que hace referencia, pero aún se ejecutará si se ejecuta la declaración de activación. Si el desencadenante no se puede recompilar con éxito, la declaración de activación recibirá un error

ORA-04098: trigger ' MASTER.INSTANCE_STEP_TRG' is invalid and failed re-validation

También parece posible que el desencadenante funcionara correctamente como se declaró, pero no como pretendía. Por ejemplo, es posible que el nuevo.sysid no haya sido mayor que 0 (recuerde que NULL no es mayor que 0) causando el WHEN cláusula para no ser cumplida. Es posiblemente que tu SELECT la declaración devolvió un valor menor o igual a 0, lo que provocó su INSERT no para ser ejecutado. Si alguno TEMPLATE.wf_step o TEMPLATE.step_stage tiene una columna STEP_ID, la WHERE cláusula

where ws.sysid= step_id;

interpretará STEP_ID Como la columna en la tabla, no su variable local STEP_ID. Una de las razones por las que los desarrolladores PL/SQL generalmente agregan prefijos a variables locales (es decir, L_STEP_ID más bien que STEP_ID) es evitar inadvertidamente el uso de un nombre que también usa una columna en una tabla porque este tipo de problemas de resolución de alcance son notoriamente difíciles de depurar.

Otros consejos

Es probable que depende de la razón por el "trigger" deja de funcionar'.

Si está activa, pero no se ejecuta a la terminación, se puede poner algo para desencadenar un mensaje en el EXCEPTION el bloque.

Si ha sido deshabilitado por completo, usted tendría que encontrar alguna característica que es cierto cuando se está ejecutando (por ejemplo, tengo algunos desencadenantes que rellenar una especie de vista materializada que es difícil de calcular sobre la marcha.Tengo un trabajo cron para que se comprueba cuando el más reciente registro de la tabla es, y si es muy viejo, informa).Si usted no tiene algo obvio como que, siempre se puede tener una tabla que es sólo para el seguimiento de cuando son los desencadenantes de la última ejecución, y la actualización de w/ el tiempo actual.

Por supuesto, ninguno de estos realmente el caso de que Justin Cueva mencionado, donde los comandos están siendo malinterpretados por la variable de la resolución de nombres.Usted podría poner un else en el if ( stepSysid>0) rama, y poner de informes de allí, si es algo que nunca debería suceder.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top