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。
下图显示错误。
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。