首页 > 解决方案 > Oracle express edition 10g 运行时触发问题

问题描述

下图显示错误。

错误截图

我在 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。然后当我更新我的员工表时

UPDATE EMPLOYEE
SET EMP_SAL=3000
WHERE DEPT_NO=10

我收到此错误消息

ORA-04098: 触发器 'Username.TR' 无效并且重新验证失败。我使用的是 Oracle 数据库 10g 速成版。

标签: plsqldatabase-triggerdmloracle-xe

解决方案


注意区别:

CREATE OR REPLACE TRIGGER TR6
                          ---

对比

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

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


通过运行检查触发器

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

[例子]

它基于 Scott 的 EMP 表。触发器故意使用: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>

我建议您发布相同的内容,在您的数据库中执行。


推荐阅读