Chinaunix首页 | 论坛 | 博客
  • 博客访问: 138372
  • 博文数量: 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里面调用的pkgtrigger本体表做了dml动作 导致oracle认为trigger在循环处理

ORA-04092 报错原因在trigger里面调用的pkgcommit语句,因为我的触发器是dml(insertupdatedelete)触发器,不能包含ddl(createdropalter)语句和dcl(commitrollbacksavepoint)语句

 

这两个报错在初学使用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

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