2010-08-09 5 views
5

Hier ist der Code, den ich verwenden, um eine Tabelle zu erstellen, eine Sequenz und einen TriggerTrigger ist ungültig und gescheiterte Wieder Validierung

DROP TABLE CDR.ExtDL_JobStatus; 

-- 
-- TABLE: CDR.ExtDL_JobStatus 
-- 

CREATE TABLE CDR.ExtDL_JobStatus(
    Id    NUMBER(38, 0) NOT NULL, 
    ShortName  NUMBER(38, 0) NOT NULL, 
    Description NUMBER(38, 0) NOT NULL, 
    CONSTRAINT PK_ExtDL_JobStatus PRIMARY KEY (Id) 
) 
; 



Declare NumOfSequences NUMBER :=0; 
Begin 
    Select COUNT(*) 
    INTO NumOfSequences 
    FROM All_Sequences 
    WHERE 1=1 
    And upper (Sequence_Owner) = upper ('CDR') 
    And upper (Sequence_Name) = upper ('ExtDL_JobStatus_Seq'); 
    If NumOfSequences > 0 Then 
    Execute IMMEDIATE 'DROP SEQUENCE CDR.ExtDL_JobStatus_Seq'; 
    End If; 
End; 
/
CREATE SEQUENCE CDR.ExtDL_JobStatus_Seq 
    INCREMENT BY 1 
    START WITH 1 
    NOMAXVALUE 
    NOMINVALUE 
; 
/

Declare NumOfTriggers NUMBER :=0; 
Begin 
    SELECT COUNT(*) 
    INTO NumOfTriggers 
    FROM All_Triggers 
    WHERE 1=1 
    And upper (Owner) = upper ('CDR') 
    And upper (Trigger_Name) = upper ('ExtDL_JobStatus_SeqTrg'); 
    If NumOfTriggers > 0 Then 
    Execute IMMEDIATE 'DROP SEQUENCE CDR.ExtDL_JobStatus_SeqTrg'; 
    End If; 
End; 
/
CREATE TRIGGER CDR.ExtDL_JobStatus_SeqTrg 
BEFORE INSERT 
ON CDR.ExtDL_JobStatus 
    FOR EACH ROW 
    WHEN (new.Id IS NULL) 
    BEGIN 
     SELECT ExtDL_JobStatus_SeqTrg.nextval into :new.Id from dual; 
    END; 


/
INSERT INTO ExtDL_JobStatus (Id, ShortName, Description) Values (0, 'Success', 'Fail') 
/
SELECT * FROM ExtDL_JobStatus 

Wenn ich den Code ausführen, ich die folgende Ausgabe

erhalten
DROP TABLE CDR.ExtDL_JobStatus succeeded. 
CREATE TABLE succeeded. 
anonymous block completed 
CREATE SEQUENCE succeeded. 
anonymous block completed 
Warning: execution completed with warning 
TRIGGER CDR.ExtDL_JobStatus_SeqTrg Compiled. 

Error starting at line 62 in command: 
INSERT INTO ExtDL_JobStatus (Id, ShortName, Description) Values (0, 'Success', 'Fail') 
Error at Command Line:62 Column:12 
Error report: 
SQL Error: ORA-04098: trigger 'CDR.EXTDL_JOBSTATUS_SEQTRG' is invalid and failed re-validation 
04098. 00000 - "trigger '%s.%s' is invalid and failed re-validation" 
*Cause: A trigger was attempted to be retrieved for execution and was 
      found to be invalid. This also means that compilation/authorization 
      failed for the trigger. 
*Action: Options are to resolve the compilation/authorization errors, 
      disable the trigger, or drop the trigger. 
ID      SHORTNAME    DESCRIPTION    
---------------------- ---------------------- ---------------------- 

0 rows selected 

Was macht meinen Auslöser ungültig?

+1

Ich habe einmal ein ähnliches Problem auftreten. Mein Problem war dadurch verursacht, dass mehr als ein Auslöser mit demselben Namen nur auf dem Gehäuse unterschieden wurde. Ich würde überprüfen, dass es nicht das gleiche Problem ist, das Sie haben. – Falle1234

+0

@Falle1234 Ich habe das 'select * from all_triggers' überprüft; keine Duplikate. –

+2

Bitte lassen Sie uns wissen, was der eigentliche Fehler ist: 'show error CDR.EXTDL_JOBSTATUS_SEQTRG' –

Antwort

6

Warnung: Ausführung abgeschlossen mit Warnung TRIGGER CDR.ExtDL_JobStatus_SeqTrg zusammengestellt.

Hier ist die Triggerkompilierung fehlgeschlagen.

sql> CREATE TRIGGER ExtDL_JobStatus_SeqTrg 
    2 BEFORE INSERT 
    3 ON ExtDL_JobStatus 
    4  FOR EACH ROW 
    5  WHEN (new.Id IS NULL) 
    6  BEGIN 
    7   SELECT ExtDL_JobStatus_SeqTrg.nextval into :new.Id from dual; 
    8  END; 
    9/

Warning: Trigger created with compilation errors. 

sql> show errors; 
Errors for TRIGGER EXTDL_JOBSTATUS_SEQTRG: 

LINE/COL ERROR 
-------- ----------------------------------------------------------------- 
2/9  PL/SQL: SQL Statement ignored 
2/16  PL/SQL: ORA-02289: sequence does not exist 

Das Problem ist, weil Sie ExtDL_JobStatus_SeqTrg in Ihrem Code verwenden und die Sequenz, die Sie ExtDL_JobStatus_Seq erstellt ist.

Wenn Sie versuchen, ein Skript wie dieses zum Erstellen (Kompilieren) der Objekte auszuführen, würde ich vorschlagen, dass Sie die folgende Klausel nach jeder Trigger/Prozedur/Funktion creatin Anweisung hinzufügen.

SHOW ERRORS; 

Wenn Ihre Aussage erfüllt ist, wird das nur keine Fehler erzeugen. Wenn Fehler auftreten, erhalten Sie eine detaillierte Beschreibung der Fehler, anstatt das Skript erneut ausführen zu müssen.

+0

' SHOW ERRORS' funktioniert gut - Danke! –

2

Es ist ein einfacher Tippfehler: Ihre Sequenz heißt ExtDL_JobStatus_Seq, aber in Ihrem Trigger verweisen Sie ExtDL_JobStatus_SeqTrg.nextval.

Für zukünftige Referenz ist es eine gute Idee, einen Anruf einzufügen, um Fehler in Skripten nach jedem Aufruf anzuzeigen, der PL/SQL kompiliert (Trigger, Prozeduren usw.). Wie folgt:

CREATE TRIGGER CDR.ExtDL_JobStatus_SeqTrg 
BEFORE INSERT 
ON CDR.ExtDL_JobStatus 
    FOR EACH ROW 
    WHEN (new.Id IS NULL) 
    BEGIN 
     SELECT ExtDL_JobStatus_SeqTrg.nextval into :new.Id from dual; 
    END; 
/

show errors 

Übrigens gibt es den gleichen Tippfehler im anonymen Block, der versucht, die Sequenz zu löschen.

+0

TX für den Hinweis auf den zusätzlichen Tippfehler sowie –

1

Neben allem bereits erwähnt, gibt es zwei zusätzliche Tippfehler/Fehler:

  1. Der anonymen PL/SQL-Block, die tatsächlich sagt DROP SEQUENCE die Auslöser zu fallen versucht.
  2. Die Anweisung insert versucht, Zeichenketten in die Spalten ShortName und Description einzufügen, die beide als NUMBER (38, 0) definiert sind.
+0

Ich habe die Sache mit den Datentypen bemerkt. Irgendwie hat sich alles in eine Domain geändert - ich habe sie auf jede einzelne Domain umgestellt –

Verwandte Themen