Ist es mir möglich, benachrichtigt zu werden, wenn ein "After -In -Einfügen- oder Update -Trigger" nicht mehr funktioniert?

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

  •  16-10-2019
  •  | 
  •  

Frage

Letzte Woche habe ich meine gefunden after insert or update trigger arbeitete nicht. Nachdem ich es deaktiviert und aktiviert hatte, begann es wieder zu arbeiten.

Ich weiß noch nicht, warum es aufgehört hat zu arbeiten. Gibt es eine Möglichkeit, damit umzugehen? Da dieser Auslöser den Wert täglicher Jobs aufzeichnet und für Berichtszwecke verwendet wird. Wenn dieser Auslöser in wenigen Tagen ohne Mitteilung oder Fehler tot ist, werde ich in heißem Wasser sein.

Ich benutze Oracle 10G, greife mit SQLDEVEVELDER auf den DB zu

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;
War es hilfreich?

Lösung

Ein Auslöser kann nicht einfach aufhören zu arbeiten.

Ein Auslöser kann deaktiviert werden. Ein Auslöser kann fallen gelassen werden. Ein Auslöser wird ungültig gemacht, wenn DDL an eines der Objekte erfolgt, die sich auf die IT -Referenzen befinden, aber weiterhin ausgeführt wird, wenn die Auslöseranweisung ausgeführt wird. Wenn der Trigger nicht erfolgreich neu kompiliert wird, wird die Auslöseranweisung einen Fehler erhält

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

Es scheint auch möglich zu sein, dass der Auslöser korrekt wie deklariert funktioniert, aber nicht wie Sie beabsichtigt hatten. Zum Beispiel ist es möglich, dass das neue. WHEN Klausel, um nicht erfüllt zu werden. Es ist möglicherweise so, dass Ihre SELECT Die Anweisung gab einen Wert weniger als oder gleich 0 zurück, wodurch Ihre verursacht wurde INSERT nicht hingerichtet werden. Wenn entweder TEMPLATE.wf_step oder TEMPLATE.step_stage hat eine Spalte STEP_ID, das WHERE Klausel

where ws.sysid= step_id;

wird interpretieren STEP_ID Als Spalte in der Tabelle nicht Ihre lokale Variable STEP_ID. Einer der Gründe, warum PL/SQL -Entwickler im Allgemeinen lokale Variablen Präfixe hinzufügen (dh L_STEP_ID statt STEP_ID) soll versehentlich einen Namen verwenden, der auch von einer Spalte in einer Tabelle verwendet wird, da diese Art von Umfangsproblemen bekanntermaßen schwer zu debuggen sind.

Andere Tipps

Es hängt wahrscheinlich davon ab, warum der Auslöser "nicht mehr funktioniert".

Wenn es ausgelöst wird, aber nicht bis zur Fertigstellung verläuft, können Sie etwas einsetzen, um eine Nachricht in die EXCEPTION Block.

Wenn es vollständig deaktiviert wurde, müssten Sie ein Merkmal finden, das beim Laufen wahr ist Wenn der jüngste Datensatz in dieser Tabelle ist und wenn es zu alt ist, meldet er es). Wenn Sie so etwas nicht offensichtlich haben, könnten Sie immer einen Tisch haben, der nur zum Verfolgen von Triggern zuletzt ausgeführt wird, und sie mit der aktuellen Zeit aktualisieren.

Natürlich hilft keiner dieser von Justin Cave, bei denen die Befehle aufgrund von variabler Namensauflösung falsch interpretiert werden. Sie könnten eine platzieren else auf der if ( stepSysid>0) Branch, und geben Sie die Berichterstattung dort an, wenn es etwas ist, das niemals tatsächlich passieren sollte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top