【问题标题】:Oracle express edition 10g trigger problem at runtimeOracle express edition 10g 运行时触发问题
【发布时间】:2020-07-15 11:23:05
【问题描述】:

下图显示错误。

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

UPDATE EMPLOYEE
SET EMP_SAL=3000
WHERE DEPT_NO=10

我收到此错误消息

ORA-04098:触发器“Username.TR”无效,重新验证失败。我使用的是 Oracle 数据库 10g 快捷版。

【问题讨论】:

  • 触发器已创建,但处于INVALID状态,无法执行。你必须修改和更正它。代码中一定有某种错误(抱歉,我没有任何 Oracle 来验证您的代码)。
  • 你的第二次推荐是错误的,@David。 :new.old.emp_no 会是什么?
  • 我已经提到了:OLD.attribute_name 伪记录名称,那么为什么我必须包含:new.OLD.attribute_name??
  • 完全正确的小脚。谢谢。
  • 请阅读Under what circumstances may I add “urgent” or other similar phrases to my question, in order to obtain faster answers? - 总结是这不是解决志愿者的理想方式,并且可能会适得其反。请不要将此添加到您的问题中。

标签: plsql database-trigger dml oracle-xe


【解决方案1】:

注意区别:

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>

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

【讨论】:

  • 不,我已经检查了 (TR1,TR2,TR3,TR4,TR5,TR6) 所有六个触发器名称,然后它也显示相同的错误 'Username.TR' 有效。跨度>
  • 我编辑了我的消息并添加了查询,它将显示您拥有的所有触发器。检查相关的。
  • 我触发了上面的查询得到了低于输出。
  • TABLE_NAME TRIGGER_NAME TRIGGER_TYPE
  • 不要作为评论发布;编辑问题(您发布的原始消息)。
【解决方案2】:

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

向你致敬@Littlefoot。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 2011-07-24
    • 1970-01-01
    • 2010-10-06
    • 2016-09-28
    • 1970-01-01
    • 2020-05-05
    相关资源
    最近更新 更多