在写trigger的时候,经常会遇到这种情况
当在程序块中需要对trigger本表进行修改或查询的时候,系统会提示错误:  ORA-04091: table is mutating, trigger/function may not see it

关于这个错误,其实是由于对本表的操作造成的.ORACLE DB里默认在写TRIGGER的时候把本表锁死,不允许对其进行操作,也就是说这个错误是不能通过系统的手段解决的,只能改用一些其它的SQL来绕开它.
刚接触TRIGGER的时候会经常犯这样的错误,其中有大部分是可以通过:new和:old来解决的,这是新手在写trigger时最需要注意的问题之一.
但是还会有一定要对本表进行修改或查询操作的情况,不能避免.

偶然的机会,发现了AUTONOMOUS_TRANSACTION,

AUTONOMOUS_TRANSACTION是指在function,procedure,trigger等subprograms中对事务进行自治管理,当在别的pl/sql block里取调用这些subprograms的时候这些subprograms并不随着父pl/sql block的失败而回滚,而是自己管自己commit。

下面举例说明。

SQL> CREATE TABLE T(ID NUMBER(18),MC VARCHAR2(20),DT DATE);

表已创建。

SQL> CREATE OR REPLACE TRIGGER TR_T
  2  AFTER DELETE ON T
  3  FOR EACH ROW
  4  DECLARE V_COUNT NUMBER;
  5  --PRAGMA AUTONOMOUS_TRANSACTION;
  6  BEGIN
  7     INSERT INTO T VALUES(:OLD.ID,:OLD.MC,SYSDATE);
  8     COMMIT;
  9  END TR_T;
10  /

触发器已创建

SQL> INSERT INTO T VALUES(1,'111111',SYSDATE);

已创建 1 行。

SQL> INSERT INTO T VALUES(2,'222222',SYSDATE);

已创建 1 行。

SQL> COMMIT;

提交完成。

SQL> SELECT ID,MC,TO_CHAR(DT,'YYYYMMDD HH24:MI:SS') FROM T;

ID MC                   TO_CHAR(DT,'YYYYM
---------- -------------------- -----------------
         1 111111               20080802 11:07:36
         2 222222               20080802 11:07:43

SQL> DELETE FROM T WHERE ID=1;
DELETE FROM T WHERE ID=1
            *
第 1 行出现错误:
ORA-04091: 表 TEST.T 发生了变化, 触发器/函数不能读它
ORA-06512: 在 "TEST.TR_T", line 4
ORA-04088: 触发器 'TEST.TR_T' 执行过程中出错

SQL> SELECT ID,MC,TO_CHAR(DT,'YYYYMMDD HH24:MI:SS') FROM T;

ID MC                   TO_CHAR(DT,'YYYYM
---------- -------------------- -----------------
         1 111111               20080802 11:07:36
         2 222222               20080802 11:07:43

SQL> CREATE OR REPLACE TRIGGER TR_T
  2  AFTER DELETE ON T
  3  FOR EACH ROW
  4  DECLARE V_COUNT NUMBER;
  5  PRAGMA AUTONOMOUS_TRANSACTION;
  6  BEGIN
  7     INSERT INTO T VALUES(:OLD.ID,:OLD.MC,SYSDATE);
  8     COMMIT;
  9  END TR_DEL_CABLE;
10  /

触发器已创建

SQL> DELETE FROM T WHERE ID=1;

已删除 1 行。

SQL> COMMIT;

提交完成。

SQL> SELECT ID,MC,TO_CHAR(DT,'YYYYMMDD HH24:MI:SS') FROM T;

ID MC                   TO_CHAR(DT,'YYYYM
---------- -------------------- -----------------
         2 222222               20080802 11:07:43
         1 111111               20080802 11:08:32

可以对本表做操作的触发器相关推荐

  1. mysql触发器对同一张表做操作_MySql 触发器对同表操作

    触发器初始结构: DELIMITER $$ CREATE TRIGGER `数据库名`.`触发器名` BEFORE/AFTER INSERT/UPDATE/DELETE ON `数据库名`.`表名` ...

  2. mysql触发器对同一张表做操作_mysql的触发器同数据库 多表的数据操作

    一.触发器的基本语法: 1.命名规则 CREATE TRIGGERBEFORE | AFTER }  //触发器触发时间是在事件之前触发还是之后触发(也可以在过程中触发) { INSERT | UPD ...

  3. 用工资表做工资条详细介绍(excle简单的录制宏操作)

    {一.纯文字}{ 1. 打开工资表(以下用类似表做示范) 2. 点击菜单栏里的[文件](如果菜单栏里有开发工具,直接跳到6)  3. 点击右边菜单栏里的[选项]  4. 点击右边菜单栏里的[自定义功能 ...

  4. 实战 | 利用Delta Lake使Spark SQL支持跨表CRUD操作

    转载自  实战 | 利用Delta Lake使Spark SQL支持跨表CRUD操作 供稿 | eBay ADI-Carmel Team 作者 | 金澜涛 编辑 | 顾欣怡 本文7309字,预计阅读时 ...

  5. matlab可以对多张表同时操作吗,update操作多张表

    sql 语句多张表UPDATE用法 一.当用一个表中的数据来更新另一个表中的数据,T-SQL提供多种写法(下面列出了二种),但建议用第一种写法,虽然传统,但结构清晰.飞.飞Asp技术乐园 并且要注意, ...

  6. 我们已经不用AOP做操作日志了!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 前言 用户在操作我们系统的过程中,针对一些重要的业务数据进行增删改 ...

  7. μC/OS Ⅱ之任务就绪表的操作_2012.5.31

    任务的登记: 1 OSRdyGrp |= OSMapTbl[prio>>3]; 2 OSRdyTbl[prio>>3] |= OSMapTbl[prio&0x07]; ...

  8. Mysql数据库大表归档操作

    由于公司的某个系统数据表过亿,考虑到数据表的压力.所以根据某个时间点对数据表做了一个归档.以下的操作是在当前的数据库新建表用于存储历史数据,然后再对生产表做一个清理操作.如果有条件的话可以把归档的数据 ...

  9. mysql数据库、表、索引、触发器

    ctrl +c退出sql程序 1.数据库 查看数据库:show databases: 创建数据库:create database tb_name; 删除数据库:drop database db_nam ...

最新文章

  1. javascript 检测 header下载文件--插件
  2. hadoop集群的白名单和黑名单示例说明
  3. Discuz!NT 在线用户功能简介
  4. LFS(Linux From Scratch)学习
  5. html超链接使用d,HTML图像的调用和超链接
  6. zabbix报错cannot set resource limit: [13] Permission denied解决方法
  7. 2021年广东开放大学期末考试方法,怎么查题,找答案
  8. 如何高效和快乐的学习RS和GIS知识
  9. Centos7系统升级
  10. 自行设计开源的pdf转word软件(python开发设计)
  11. Docker 极简入门指南
  12. 山东CIO智库——山东省两化融合深度行龙口站成功举办
  13. C# CS客户端不显示垂直滚动条
  14. Android知识点 015 —— 2.3.9 CountDownTimer倒计时(补充 疯狂Android讲义)
  15. C语言用一维数组模拟抛硬币,模拟抛硬币(C语言实现)
  16. rollup又一打包利器,不需要的代码统统走开
  17. 2017最新qq第三方登陆教程
  18. 二、计算机网络知识汇总
  19. 令人肝肠寸断的100个签名首语
  20. JavaScript Set

热门文章

  1. 使用ENVI读取Earth Engine下载的图像波段名的方法
  2. WordPress登录注册评论滑动图片验证码插件腾讯云验证码(CAPTCHA)
  3. 视频存储格式YUV420 NV12 NV21 i420 YV12详解
  4. 自动关机批处理bat,一行代码实现自动关机
  5. listview控件不兼容
  6. 康奈尔本科学计算机要什么条件,2020康奈尔大学计算机科学专业申请有哪些条件?...
  7. 基于ODX的工程诊断仪 — DDS
  8. MySQL Server 连接工具
  9. Diverse Embedding Expansion Network and Low-Light Cross-Modality Benchmark for V-I Re-ID:如何有效利用生成嵌入?
  10. 【论文学习】人脸识别——DeepFace:深度学习人脸识别开山之作