2010-08-09 14 views
5

Aquí está el código que utilizo para crear una tabla, una secuencia y un disparadorTrigger es inválida y no pudo revalidar

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 

Cuando ejecuto el código, me sale el siguiente resultado

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 

¿Qué hace que mi trigger sea inválido?

+1

Tengo un problema similar una vez. Mi problema se debe a tener más de un disparador con el mismo nombre que difiere solo en la carcasa. Verificaría que no era el mismo problema que tienes. – Falle1234

+0

@ Falle1234 Comprobé que 'select * from all_triggers'; sin duplicados –

+2

por favor, háganos saber cuál es el error real: 'mostrar error CDR.EXTDL_JOBSTATUS_SEQTRG' –

Respuesta

6

Advertencia: ejecución completada con la advertencia TRIGGER CDR.ExtDL_JobStatus_SeqTrg Compilado.

Aquí es donde falló la compilación de su desencadenador.

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 

El problema se debe a que está utilizando ExtDL_JobStatus_SeqTrg en el código y la secuencia que ha creado es ExtDL_JobStatus_Seq.

Además, si está intentando ejecutar un script como este para crear (compilar) los objetos, le sugiero que agregue la siguiente cláusula después de cada declaración de activación de trigger/procedure/function.

SHOW ERRORS; 

Si su estado de cuenta se acelera, no producirá errores. Si hay errores, tendrá una descripción detallada de los errores en lugar de tener que ejecutar el script de nuevo.

+0

' SHOW ERRORS' funciona muy bien - ¡Gracias! –

2

Es un error simple: su secuencia se llama ExtDL_JobStatus_Seq pero en su activador hace referencia al ExtDL_JobStatus_SeqTrg.nextval.

Para futuras referencias, es una buena idea incluir una llamada para mostrar el error en las secuencias de comandos después de cada llamada que compila PL/SQL (disparadores, procedimientos, etc.). De esta manera:

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 

Por cierto, hay el mismo error en el bloque anónimo que intenta soltar la secuencia.

+0

tx para señalar el error adicional –

1

Además de todo lo mencionado anteriormente, hay dos errores tipográficos/errores adicionales:

  1. El bloque PL/SQL anónimos que intenta soltar el gatillo realmente dice DROP SEQUENCE.
  2. La instrucción de inserción intenta insertar cadenas de caracteres en las columnas Nombre corto y Descripción, que se definen como NÚMERO (38, 0).
+0

Me di cuenta de lo de los tipos de datos. De alguna manera, todo había cambiado a un dominio: lo cambié a cada dominio individual –