Est-il possible pour moi d'être informé si un « déclencheur d'insertion après la mise à jour ou » ne fonctionne plus?

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

  •  16-10-2019
  •  | 
  •  

Question

La semaine dernière, j'ai trouvé mon after insert or update trigger ne fonctionnait pas. Après avoir désactivé et activé, il a commencé à travailler à nouveau.

Je ne sais pas encore pourquoi il a cessé de fonctionner. Y at-il moyen de régler ce problème? Parce que ce déclencheur enregistre la valeur des tâches quotidiennes, et est utilisé à des fins de rapport. Si ce déclencheur va mort dans quelques jours sans mon avis ou erreur, je serai dans l'eau chaude.

J'utilise Oracle 10g, accédez à la db en utilisant 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;
Était-ce utile?

La solution

Un déclencheur ne peut pas arrêter tout simplement travailler.

Un déclencheur peut être désactivé. Un déclencheur peut être abandonné. Un déclencheur sera invalide si LDD est fait à l'un des objets auxquels il fait référence, mais il sera toujours exécuté si l'instruction de déclenchement est exécutée. Si le déclencheur ne parvient pas à recompiler avec succès, l'instruction de déclenchement recevra une erreur

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

Il semble également possible que le déclencheur fonctionnait correctement comme déclaré mais non comme vous le souhaitez. Par exemple, il est possible que le new.sysid n'était pas supérieur à 0 (rappelez-vous que NULL n'est pas supérieur à 0) entraînant la clause WHEN de ne pas être atteint. Il est peut-être que votre déclaration de SELECT a retourné une valeur inférieure ou égale à 0, ce qui provoque votre INSERT de ne pas être exécuté. Si l'une ou TEMPLATE.wf_step TEMPLATE.step_stage a une colonne STEP_ID, la clause WHERE

where ws.sysid= step_id;

interprétera STEP_ID comme la colonne dans la table, pas votre STEP_ID variable locale. L'une des raisons pour lesquelles les développeurs PL / SQL ajoutent généralement préfixes à des variables locales (L_STEP_ID plutôt que STEP_ID) est d'éviter d'utiliser, par inadvertance, un nom qui est également utilisé par une colonne dans une table, car ce genre de problèmes de résolution de portée sont notoirement difficiles à débogage.

Autres conseils

Cela dépend probablement pourquoi le déclencheur "cesse de fonctionner.

Si elle est déclenchée, mais ne fonctionne pas à la fin, vous pouvez mettre quelque chose pour déclencher un message dans le bloc EXCEPTION.

Si elle a été désactivé entièrement, vous auriez à trouver une caractéristique qui est vrai quand il est en cours d'exécution (par exemple, j'ai quelques déclencheurs qui peuplent une sorte de vue matérialisée qui est difficile à calculer à la volée. J'ai un emploi cron vérifie quand est, et si elle est trop vieux, il le signale) le dossier le plus récent dans ce tableau. Si vous n'avez pas quelque chose d'évident comme ça, vous pouvez toujours avoir une table qui est juste pour le suivi lorsque les déclencheurs sont la dernière exécution, et le mettre à jour avec / l'heure actuelle.

Bien sûr, aucun de ces aider vraiment le cas que Justin Cave mentionné, où les commandes sont mal interprétés en raison de la résolution de nom variable. Vous pouvez mettre un else sur la branche if ( stepSysid>0), et mettre des rapports là-bas si elle est quelque chose qui ne devrait jamais se produire réellement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top