plsql - 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 速成版。
解决方案
注意区别:
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>
我建议您发布相同的内容,在您的数据库中执行。
推荐阅读
- python - pymongo ChangeStream 无法处理的年份解决方法
- c# - Unity - 我如何实现波数?
- ios - 本地化:Domain=com.alamofire.error.serialization.response Code=-1011 “请求失败:未找到 (404)
- c++ - 设计模式 - 在另一个类中组成的数据类型的过滤视图
- python - Python - 在日期范围内创建新列(总和) - 滚动总和?
- javascript - 使用 JavaScript 根据正则表达式匹配显示句子
- ruby-on-rails - Rails Cancancan 授权模型中的多对多关系
- .net - 加载 html 文件时 CefSharp Chromiumbrowser 冻结
- sql - 选择最大日期小于上一年的 12 月 31 日的行
- php - TYPO3 - 自己的升级向导:使用来自其他表的 SELECT 插入