全部博文(43)
2011年(43)
分类: Oracle
2011-06-15 15:02:30
当想在trigger下调用pkg时候报错:
ORA-04091 - "Table
ORA-04092 cannot COMMIT in a trigger
ORA-04091 报错原因在trigger里面调用的pkg对trigger本体表做了dml动作 导致oracle认为trigger在循环处理
ORA-04092 报错原因在trigger里面调用的pkg有commit语句,因为我的触发器是dml(insert、update、delete)触发器,不能包含ddl(create、drop、alter)语句和dcl(commit、rollback、savepoint)语句
这两个报错在初学使用trigger时最容易出现,怎么解决
ORA-04091 不在trigger里对本体表做操作,我碰到的比较好处理,不在trigger里面调pkg,在其他时机其他pkg下调此pkg就解决了,所以没有碰到一定要在trigger下处理本体表的
ORA-04092 将trigger下的ddl语句移出,建另外的pkg来实现或者在系统级trigger下执行
Trigger
功能:
1、 允许/限制/自动执行对表的修改
2、 强制数据一致性
3、 提供审计和日志记录
4、 防止无效的事务处理
5、 处理复杂的业务逻辑
触发器类型:
1、 语句触发器
2、 行触发器
3、 INSTEAD OF 触发器
4、 系统条件触发器
5、 用户事件触发器
事务处理:
在触发器中,不能使用commit / rollback
因为ddl语句具有隐式的commit,所以也不允许使用
视图:
dba_triggers