1、初始目标

在对表h1插入一条数据时,同时插入一条重复的数据(只有主键不同)

2、在PL/SQL里New一个Trigger或者手动敲入代码

先说明一下,表h1包括4列ID、C1、C2、C3

create or replace trigger Trigger_Testafter insert on h1for each row
declare--variables
begininsert into h1 values(:new.C1, :new.C2, :new.C3, :new.ID);
end Trigger_Test;

3、F8编译通过,新建一个窗口执行insert窗口,测试trigger是否有效,用了一个名为sequence_test的序列:

insert into h1 values('aa','bb','cc',sequence_test.nextval);

报错:表h1发生了变化,触发器/函数不能读。

4、网上搜的说法是“触发器不能修改触发表的数据,除非使用自治事务”,OK那就用自治事务:

declare--variables
//改为:
declarepragma autonomous_transaction;

再试报错:等待资源时检测到死锁。仔细一查,哦原来是目标有问题,Insert连着Insert,无限循环,不是资源死锁就是内存不足或者栈溢出。

5、目标更新为:在对表h1插入一条数据时,同时插入一条相同的数据到历史表里,把trigger里的insert修改为:

insert into h1_history values(:new.C1, :new.C2, :new.C3, :new.ID);

再跑又报错:检测到活动的自治事务处理,已经回退。

6、网上接着搜,说是有事务没提交。其实这是之前目标设定有问题,触发器一般不会修改触发表,用了自治事务,就要commit;如果是插入历史表,可以都不加。

declarepragma autonomous_transaction;commit;delete from h1 where ID = 1;commit;//如果不操作触发表,则可以去掉自治事务的这一串声明
declareinsert into h1_history values(:new.C1, :new.C2, :new.C3, :new.ID);

7、小结

  1. Trigger在修改其他表(非触发表)的时候,最方便,直接像写存储过程即可;
  2. 若要使用Trigger修改触发表的数据,需要配合使用自治事务并commit,比较麻烦;
  3. 对新操作的记录本身(比如新Insert/Update/Delete的数据),无法做修改,并且如果强行修改的话,既不会报错,也没有效果。

转载于:https://www.cnblogs.com/AlexanderYao/p/4514377.html

在oracle中使用Trigger相关推荐

  1. Oracle中创建和使用触发器Trigger

    本文是简单的课程笔记 – 触发器(门铃) 监听器 create or replace trigger 名字 before|after insert|delete|update on 表名 for ea ...

  2. oracle 存储过程 状态,查看ORACLE中正在运行的存储过程 | 学步园

    1.如何查看ORACLE中正在运行的存储过程 select owner,name from v$db_object_cache where type like '%PROCE%' and locks ...

  3. oracle中创建触发器

    从csdn上面看到一个如何创建触发器的问题,感觉自己很有必要保存学习,特写下来: 条件: 现有A.B两张表 A: 工号 姓名 密码 性别 年龄 ... B: 工号 姓名 密码 当对A表中的" ...

  4. Sequence在Oracle中的使用

    Oracle中,当需要建立一个自增字段时,需要用到sequence.sequence也可以在mysql中使用,但是有些差别,日后再补充,先把oracle中sequence的基本使用总结一下,方便日后查 ...

  5. 在Oracle中实现自增加ID的功能

    我们经常在设计数据库的时候用一个系统自动分配的ID来作为我们的主键,在SQL SERVER 中有系统自带的ID自增功能,但是在ORACLE中没有这样的功能,我们可以通过采取以下方法实现自动增加ID的功 ...

  6. oracle中primary,oracle中如何 Primary key自增

    oracle中如何 Priamry key自增 摸索了一晚上,终于实现了key的自增,现在将实现的过程总结如下: (1)首先创建一个表:这里是我创建的一个User表,包括id,user_name,pa ...

  7. Oracle里default什么意思,ORACLE中默认值default的使用方法.doc

    ORACLE中默认值default的使用方法 在创建数据库表时,你可以指定一个 DEFAULT 值(即默认值).对数据库字段使用默认值有助于将数据库设计问题与应用程序代码隔离. 可以在以后某个时候通过 ...

  8. Oracle 中重新编译无效的存储过程, 或函数、触发器等对象(转)

    Oracle 中的存储过程在有些情况下会变成失效状态,在 PL/SQL Developer 中该存储过程的图标左上角显示一把小红叉叉.比如储过程所引用的对象失效,dblink 出问题啦都可能引起用到它 ...

  9. oracle 数据库 触发器 trigger 语法

    http://shixm.iteye.com/blog/401564 关键字: oracle 数据库 触发器 trigger 语法 语法规则: Create [or replace] trigger ...

最新文章

  1. CVPR2020人脸防伪检测挑战赛冠军方案开源
  2. Neo4j和Titan的对比
  3. Android中事件的传递
  4. 【bzoj4318】OSU! 期望dp
  5. 常考数据结构与算法:排序
  6. tracert 路由跟踪程序
  7. httpclient 学习
  8. AbstractFactoryPattern(23种设计模式之一)
  9. .NET 6 Preview5+VS2022实战千万并发秒杀项目,帅爆了(附源码)
  10. 1143 Lowest Common Ancestor 甲级
  11. centos8 阿里云yum源_CentOS7更换阿里yum源
  12. 亲密关系沟通-【认识需求2】-建立良好沟通环境
  13. centos7 mysql 数据库备份与还原
  14. 华为harmonyos公测,华为开启HarmonyOS2.0开发者Beta公测招募第二期
  15. 物联网全栈教程-从云端到设备(四)
  16. 全国计算机二级c语言怎么复习,全国计算机二级C语言考试复习五要点
  17. vue-echart简单使用
  18. 小小白的Android入门之计算器学习
  19. Excel数据分析入门-数据图表
  20. python爬虫需要哪些基础知识-【PYTHON】【爬虫】关于python爬虫的一些基础知识

热门文章

  1. sketch软件_因远程协作大火的Figma,到底有多好用,会取代Sketch的地位吗?
  2. python如何遍历文件夹中的所有图片_python实现遍历文件夹图片并重命名
  3. Hadoop配置完善
  4. [机器学习]正则化方法 -- Regularization
  5. python学习: 优秀Python学习资源收集汇总--转
  6. Socket 编程 windows到Linux代码移植遇到的问题
  7. adb shell 调试 Android 串口
  8. 安全警报 该站点安全证书_深度学习如何通过实时犯罪警报确保您的安全
  9. 基础003_V7-Memory Resources
  10. dibian+9+oracle+java_debian – 安装了Oracle Java,但在安装软件时,我得到了`你的Java版本不受支持....