Oracle Express Edition 10g 运行时触发问题

Oracle express edition 10g trigger problem at runtime

下图显示错误。

error screenshot

我已经在 plsql 中创建了这个简单的触发器。

 CREATE OR REPLACE TRIGGER TR6
 BEFORE UPDATE ON EMPLOYEE
 FOR EACH ROW
 BEGIN
 INSERT INTO PRAC14 (EMP_NO,EMP_NAME,EMP_SAL,DEPT_NO)
 VALUES(:OLD.EMP_NO,:OLD.EMP_NAME,:OLD.EMP_SAL,:OLD.DEPT_NO); 
 END;
 /

在 运行 上面的代码之后它显示 TRIGGER CREATED。 然后当我更新我的员工时 table 就像

UPDATE EMPLOYEE
SET EMP_SAL=3000
WHERE DEPT_NO=10

我收到这条错误消息

ORA-04098: trigger 'Username.TR' is invalid and failed re-validation.I am using Oracle database 10g express edition.

注意区别:

CREATE OR REPLACE TRIGGER TR6
                          ---

对比

ORA-04098: trigger 'Username.TR' is invalid 
                             --

table 似乎还有另一个无效的触发器。要么修复它,要么放弃它。


检查触发器运行

select table_name, trigger_name, trigger_type from user_triggers order by 1, 2;

[例子]

它基于斯科特的 EMP table。触发器故意使用 :old.empnox,一个不存在的列。它导致你得到错误:

SQL> create table prac14  as select empno, ename, sal, deptno
  2  from emp where 1 = 2;

Table created.

SQL>
SQL> create or replace trigger tr6
  2    before update on emp
  3    for each row
  4  begin
  5    insert into prac14 (empno,ename,sal,deptno)
  6    values(:old.empnox,:old.ename,:old.sal,:old.deptno);
  7  end;
  8  /

Warning: Trigger created with compilation errors.

SQL>
SQL> update emp set sal = 3000 where deptno = 10;
update emp set sal = 3000 where deptno = 10
       *
ERROR at line 1:
ORA-04098: trigger 'SCOTT.TR6' is invalid and failed re-validation

但是,如果触发代码是固定的,一切运行正常:

SQL> create or replace trigger tr6
  2    before update on emp
  3    for each row
  4  begin
  5    insert into prac14 (empno,ename,sal,deptno)
  6    values(:old.empno,:old.ename,:old.sal,:old.deptno);
  7  end;
  8  /

Trigger created.

SQL>
SQL> update emp set sal = 3000 where deptno = 10;

3 rows updated.

SQL>

我建议你post同样的,在你的数据库中执行。

我已经为单个 table 上的 DML 操作创建了多个触发器。这就是我收到错误的原因。我已经删除了 EMPLOYEE table 上的所有其他触发器,除了 TR6 并且它起作用了。

感谢你@Littlefoot。