代码之家  ›  专栏  ›  技术社区  ›  Raj More

触发器无效,重新验证失败

  •  5
  • Raj More  · 技术社区  · 14 年前

    下面是我用来创建表、序列和触发器的代码

    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 回复  |  直到 14 年前
        1
  •  6
  •   Rajesh Chamarthi    14 年前

    警告:执行已完成 警告触发器

    这就是触发器编译失败的地方。

    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
    

    问题是因为你正在使用 外部工作状态 外部工作状态 .

    SHOW ERRORS;
    

    如果你的陈述成功了,那就不会产生错误。如果有任何错误,您将有错误的详细描述,而不必再次执行脚本。

        2
  •  2
  •   APC    14 年前

    ExtDL_JobStatus_Seq ExtDL_JobStatus_SeqTrg.nextval .

    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
    

    顺便说一句,匿名块中有相同的输入错误,试图删除序列。

        3
  •  1
  •   AndyDan    14 年前

    1. DROP SEQUENCE .
    2. insert语句尝试将字符串插入到ShortName和Description列中,这两个列都定义为NUMBER(38,0)。