Na semana passada, descobri que o meu after insert or update trigger
não estava funcionando. Depois que desabilitei e habilitei, voltou a funcionar.
Ainda não sei porque parou de funcionar. Existe alguma maneira de lidar com isso? Porque esse gatilho está registrando o valor dos trabalhos diários e é usado para fins de relatório. Se esse gatilho for desativado em alguns dias sem meu aviso ou erro, estarei em apuros.
Estou usando o Oracle 10g, acesse o db usando o 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;
Um gatilho não pode simplesmente parar de funcionar.
Um gatilho pode ser desabilitado. Um gatilho pode ser descartado. Um gatilho será invalidado se o DDL for feito para um dos objetos que ele referencia, mas ainda será executado se a instrução de disparo for executada. Se o gatilho não for recompilado com sucesso, a instrução de disparo receberá um erro
Também parece possível que o gatilho estivesse funcionando corretamente conforme declarado, mas não como você pretendia. Por exemplo, é possível que o new.sysid não seja maior que 0 (lembre-se que NULL não é maior que 0) fazendo com que a
WHEN
cláusula não seja atendida. É possível que seuSELECT
comando tenha retornado um valor menor ou igual a 0, fazendo com que seuINSERT
não seja executado. SeTEMPLATE.wf_step
ouTEMPLATE.step_stage
tiver uma colunaSTEP_ID
, aWHERE
cláusulainterpretará
STEP_ID
como a coluna na tabela, não sua variável localSTEP_ID
. Uma das razões pelas quais os desenvolvedores PL/SQL geralmente adicionam prefixos às variáveis locais (ou sejaL_STEP_ID
, em vez deSTEP_ID
) é evitar o uso inadvertido de um nome que também é usado por uma coluna em uma tabela porque esses tipos de problemas de resolução de escopo são notoriamente difíceis de depurar.Provavelmente depende do motivo pelo qual o gatilho 'para de funcionar'.
Se estiver sendo acionado, mas não for executado até o fim, você pode colocar algo para acionar uma mensagem no
EXCEPTION
bloco.Se tiver sido desativado totalmente, você terá que encontrar alguma característica que seja verdadeira quando estiver em execução (por exemplo, tenho alguns gatilhos que preenchem um tipo de visualização materializada que é difícil de calcular em tempo real. Tenho um cron job que verifica para ver quando o registro mais recente nessa tabela é, e se for muito antigo, ele o reporta). Se você não tiver algo óbvio como isso, sempre poderá ter uma tabela que seja apenas para rastrear quando os gatilhos foram executados pela última vez e atualizá-la com a hora atual.
Claro, nenhum deles realmente ajuda no caso que Justin Cave mencionou, onde os comandos estão sendo mal interpretados por causa da resolução do nome da variável. Você pode colocar um
else
naif ( stepSysid>0)
ramificação e colocar relatórios lá se for algo que nunca deveria acontecer.