Триггер недействителен и не прошел повторную проверку - PullRequest
5 голосов
/ 09 августа 2010

Вот код, который я использую для создания таблицы, последовательности и триггера

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

Когда я выполняю код, я получаю следующий вывод

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

Что делает мой триггер недействительным?

Ответы [ 3 ]

6 голосов
/ 09 августа 2010

Предупреждение: выполнение завершено с предупреждением TRIGGER CDR.ExtDL_JobStatus_SeqTrg Скомпилировано.

В этом случае ваша компиляция триггера не удалась.

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

Проблема в том, что выиспользование ExtDL_JobStatus_SeqTrg в вашем коде и созданная вами последовательность ExtDL_JobStatus_Seq .

Кроме того, если вы пытаетесь запустить такой скрипт для создания (компиляции) объектовЯ бы посоветовал вам добавить следующий пункт после каждого оператора триггера / процедуры / функции creatin.

SHOW ERRORS;

Если ваш оператор окажется успешным, это просто не приведет к ошибкам.Если есть какие-либо ошибки, у вас будет подробное описание ошибок вместо того, чтобы снова запускать скрипт.

2 голосов
/ 09 августа 2010

Это простая опечатка: ваша последовательность называется ExtDL_JobStatus_Seq, но в вашем триггере вы ссылаетесь на ExtDL_JobStatus_SeqTrg.nextval.

Для дальнейшего использования рекомендуется включать вызов для отображения ошибки в скриптах после каждого вызова, который компилирует PL / SQL (триггеры, процедуры и т. Д.). Как это:

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

Кстати, в анонимном блоке есть та же опечатка, которая пытается отбросить последовательность.

1 голос
/ 09 августа 2010

В дополнение ко всему ранее упомянутому есть две дополнительные опечатки / ошибки:

  1. Анонимный блок PL / SQL, который пытается сбросить триггер, на самом деле говорит: DROP SEQUENCE.
  2. Оператор вставки пытается вставить строки символов в столбцы ShortName и Description, которые оба определены как NUMBER (38, 0).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...