Chinaunix首页 | 论坛 | 博客
  • 博客访问: 147595
  • 博文数量: 43
  • 博客积分: 810
  • 博客等级: 军士长
  • 技术积分: 430
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-03 02:39
文章分类
文章存档

2011年(43)

分类: Oracle

2011-06-15 15:02:30

Trigger:表数据写入、更新、删除动作时候自动备份到log表,能正常运行

当想在trigger下调用pkg时候报错:

ORA-04091 - "Table is mutating " error.

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

阅读(1685) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~