经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Oracle » 查看文章
Oralce 触发器
来源:cnblogs  作者:KpGo  时间:2019/9/10 10:50:10  对本文有异议

今天做了一个需要用到触发器实现的功能中间去到了各种问题,还好最后都解决了;

整个过程中真是遇到了不少错误:

  ORA-04091: 表 KPGO.T_ISSUER 发生了变化, 触发器/函数不能读它 

  ORA-04092: COMMIT 不能在触发器中

  ORA-04098:触发器“xx.xxx”无效且未通过重新定义

首先说第一个错是因为这样的代码:

 

 原因是

触发器和存储过程中中用:再次去查目标表(就是你触发器服务的那张表),这一动作被oracle认为是不合法的。

目标表的记录行如果做了更新,无需再通过ID去查询目标记录行。这一动作被oracle认为是不合法的。

 

那咋整!!!咱也不知道,咱也不知道问谁,拉倒吧自己百度

嗯!!!就在那么一瞬间我看到了一个似乎可以拯救我得答案,它得变量赋值方式我很喜欢,必须咱也得弄(neng四声)一下

 

 嗯整挺好 不在报那个错了

但是啊 人啊不能太嚣张 紧接着给我整了个第二个错 ORA-04092: COMMIT 不能在触发器中

当时脑瓜带 嗡一下子 我努力让自己清醒 磕了一袋瓜子喝了杯茶水 我又意识到 

触发器里面是不能执行ddl语句和commit操作的 原因就在调用得那个函数里面 

既然问题找到了 干他

DDL语句用语定义和管理数据库中的对象,如Create,Alter,Drop,truncate等;

DDL操作是隐性提交的!操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger

DML(Data Manipulation Language)数据操纵语言命令使用户能够查询数据库以及操作已有数据库中的数据。
如insert,delete,update,select等都是DML.

虽然在触发器里没有写ddl语句但是tm这个函数里有,wc我这小脾气就上来了,又是一顿小百度

 

 为触发器添加自治事务,完美解决

至于ORA-04098:触发器“xx.xxx”无效且未通过重新定义这个错,一般就是没仔细有写错得地方,好好看看

还有就是如果你的数据库链接工具是navicat 那你得看看你的触发器是不是完整的,有的时候他可能只给你编译了一半

到这里就OK了,工作以来第一次写触发器,记录一下方便学习

重点:

  1.oracle触发器中定义变量得赋值方式要注意下,选择适合自己需求的

  2.触发器中每一句语句都要有分号,别懒

  3.触发器不能执行ddl语句和commit操作,如果想用加自治事务(但是我好像见过专门的ddl触发器但是真的得是表什么得。。想了解得自己查吧)

 

原文链接:http://www.cnblogs.com/KpGo/p/11475500.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号