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 express版本。

注意区别:

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;

[示例]

它基于斯科特的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>

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

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

感谢你@Littlefoot。

最新更新