今天做了一个需要用到触发器实现的功能中间去到了各种问题,还好最后都解决了;
整个过程中真是遇到了不少错误:
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触发器但是真的得是表什么得。。想了解得自己查吧)