Es posible para mí para ser notificado si 'después de desencadenador insert o update' deja de funcionar?
-
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;
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.