DML触发器是最常见的触发器类型,开发人员用的比较多;而其他类型的触发器主要是用于数据库管理或者审计,DBA用的比较多。

1、DML触发器简介

BEFORE 触发器

这种触发器是在某个操作发生之前触发的,比如before insert就是在插入操作之前触发。

AFTER 触发器

这种触发器是在某个操作发生之后触发的,比如after update就是在插入操作之前触发。

语句级别触发器

这种触发器是由整个SQL语句触发的。这个SQL语句可能操作数据库表的一条或者多条数据。

行级别触发器

这种触发器针对的是SQL语句执行过程中操作的每一行记录。假设books表中有1000行记录。下面的update语句就会修改1000行记录:

update books set title = upper(title);

如果我在books表上定义了一个行级别的更新触发器,这个触发器就会被触发1000次。

伪记录 NEW

这是一个被叫做NEW的数据结构,看起来和PL/SQL中的记录非常相似。只有在更新操作和插入操作的DML触发器中才能使用这个伪记录;这个记录包含的是被操作的行修改之后的值。

伪记录 OLD

这是一个被叫做OLD的数据结构,看起来和PL/SQL中的记录非常相似。只有在更新操作和插入操作的DML触发器中才能使用这个伪记录;这个记录包含的是被操作的行修改之前的值。

WHEN 子句

DML触发器用这个子句来确定是否应该执行触发器的代码,我们可以用它来避免不必要的执行。

有关事务

DML触发器会参与到触发他们的事务中。

如果触发器抛出了异常,这部分事务会回滚(rollback)。

如果触发器本身也执行了DML语句(比如向日志表中插入一行数据),这个DML同时也会成为主体事务的一部分。

不能在DML触发器里执行commit或者rollback语句。

2、创建DML触发器

1 CREATE [OR REPLACE] TRIGGER trigger_name --指定一个触发器名字, or replace 可选
2 {BEFORE | AFTER} --指定触发器时机是在语句执行之前或者之后。
3 {INSERT | DELETE | UPDATE | UPDATE OF column_list } ON table_name --指定触发器应用的DML类型组合:插入、更新或者删除操作。
4 [FOR EACH ROW] --如果指定了for each row 则语句处理的每一行记录都会激活触发器。
5 [WHEN (...)] --通过这个可选的when子句,可以避免不必要的执行
6 [DECLARE ... ]
7 BEGIN
8 ...executable statements... --执行体
9 [EXCEPTION ... ] --可选异常处理部分
10 END [trigger_name];

Examples:

-- an after statement level trigger

CREATE OR REPLACE TRIGGER statement_trigger
AFTER INSERT ON to_table
BEGIN
DBMS_OUTPUT.PUT_LINE('After Insert Statement Level');
END;
/
/*-- an after row level trigger */
CREATE OR REPLACE TRIGGER row_trigger
AFTER INSERT ON to_table
FOR EACH ROW
BEGIN
DBMS_OUTPUT.PUT_LINE('After Insert Row Level');
END;
/

-- a before statement level trigger
CREATE OR REPLACE TRIGGER before_statement_trigger
BEFORE INSERT ON to_table
BEGIN
DBMS_OUTPUT.PUT_LINE('Before Insert Statement Level');
END;
/

-- a before row level trigger
CREATE OR REPLACE TRIGGER before_row_trigger
BEFORE INSERT ON to_table
FOR EACH ROW
BEGIN
DBMS_OUTPUT.PUT_LINE('Before Insert Row Level');
END;
/

-- after insert statement
CREATE OR REPLACE TRIGGER after_insert_statement
AFTER INSERT ON to_table
BEGIN
DBMS_OUTPUT.PUT_LINE('After Insert Statement');
END;
/

-- after update statement
CREATE OR REPLACE TRIGGER after_update_statement
AFTER UPDATE ON to_table
BEGIN
DBMS_OUTPUT.PUT_LINE('After Update Statement');
END;
/

-- after delete statement
CREATE OR REPLACE TRIGGER after_delete_statement
AFTER DELETE ON to_table
BEGIN
DBMS_OUTPUT.PUT_LINE('After Delete Statement');
END;
/

2.1、使用WHEN子句

例如使用WHEN子句确保只有把薪水修改成不同的值时触发器代码才会执行:

CREATE OR REPLACE TRIGGER check_raise
AFTER UPDATE OF salary
ON employees
FOR EACH ROW
WHEN ( (old.salary != new.salary)
OR (old.salary IS NULL AND new.salary IS NOT NULL)
OR (old.salary IS NOT NULL AND new.salary IS NULL))
BEGIN
NULL;
END;
/

WHEN子句使用注意事项:

a.要把整个判断逻辑表达式括起来()

b.不要在OLD和NEW之前加上”:”

c.使用WHEN子句时只能使用SQL内置函数;

2.2、使用NEW和OLD伪记录

CREATE OR REPLACE TRIGGER bef_ins_ceo_comp
BEFORE INSERT
ON ceo_compensation
FOR EACH ROW
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO ceo_comp_history
VALUES (
:new.name
, :old.compensation
, :new.compensation
, 'AFTER INSERT'
, SYSDATE
);

COMMIT;
END;
/

Oracle触发器2-DML触发器相关推荐

  1. DDL触发器与DML触发器比较

    DML触发器 DML触发器就是普通的  INSERT / UPDATE / DELETE 触发器. DDL触发器就是一些特有的 DDL 语句的触发器. 例如:登陆到服务器的触发, 创建数据库的触发.  ...

  2. oracle创建dml触发器,Oracle数据库创建DML触发器

    触发器的基本分类 1.行触发器:数据库表中的每一行有变化都会触发一次触发器代码 2.语句触发器:与语句所影响的行数无关,仅触发一次 3.BEFORE触发器:在DML语句执行之前触发 4.ALFTER触 ...

  3. Oracle入门(十四.20)之创建DML触发器:第一部分

    一.什么是DML触发器? DML触发器是执行SQL DML语句(INSERT,UPDATE或DELETE)时自动触发(执行)的触发器. 您可以通过两种方法对DML触发器进行分类: •执行时间:BEFO ...

  4. oracle dml触发器 获取当前执行sql语句,Oracle DML触发器

    DML触发器的要点 DML触发器是定义在表上的触发器,由DML事件引发.编写DML触发器的要素是: * 确定触发的表,即在其上定义触发器的表. * 确定触发的事件,DML触发器的触发事件有INSERT ...

  5. mysql 触发器不能同时 insert or update or delete_运维日记|SQL server 那点事——DML触发器...

    11月19日,21点,小编正六指霸屏,决赛圈1V4,忽然,电话响了,这种感觉很熟悉,不错,上次差点推掉对面水晶的那一幕又上演了--作为一名美创的员工,客户才是第一位,我毫不犹豫的摁下了接听键. ​ X ...

  6. oracle行级的触发器,Oracle触发器Trigger2行级

    create table trigger_t2( id int, name varchar(30), age int ); /* --创建一个before update的触发器-控制每一行,行级 -- ...

  7. sqlserver 触发器 update_运维日记| SQL server 那点事——DML触发器

    各位新朋友-记得先点蓝字关注我哦- 11月19日,21点,小编正六指霸屏,决赛圈1V4,忽然,电话响了,这种感觉很熟悉,不错,上次差点推掉对面水晶的那一幕又上演了--作为一名美创的员工,客户才是第一位 ...

  8. PL/SQL -- DML 触发器

    --======================= -- PL/SQL --> DML 触发器 --======================= 何谓触发器?简言之,是一段命名的PL/SQL代 ...

  9. Oracle学习笔记十三 触发器

    2019独角兽企业重金招聘Python工程师标准>>> 简介 触发器是当特定事件出现时自动执行的存储过程,特定事件可以是执行更新的DML语句和DDL语句,触发器不能被显式调用. 触发 ...

  10. 杂谈--DML触发器学习

    触发器按类型分为三类: 1. DML 触发器,在数据变更时触发: 2. DDL 触发器,在修改数据库级别或实例级别对象时触发: 3. Login 触发器,在用户登录时触发: 最常见的是DML触发器,D ...

最新文章

  1. 对话框中加入标签页的5种方法
  2. mysql 触发器 分行_mysql 触发器
  3. 经验分享:布线测试关键步骤有哪些 ?
  4. Spring框架中的9种设计模式汇总
  5. boost::hana::if_用法的测试程序
  6. 前端学习(3047):vue+element今日头条管理-使用table表格组件
  7. 上传文件的php代码,PHP实现大文件上传源代码
  8. oracle唯一索引能删除吗,Oracle:ora-02429:无法用于删除强制唯一/主键的索引 解决...
  9. 前端开发常用免费资源,显著提升工作效率
  10. Qt 信号-槽的同步与异步处理
  11. XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Korea
  12. SAPJCO3升级3.1后报错java.lang.UnsatisfiedLinkError: sapjco3.dll解决
  13. ffmpeg和JavaCV
  14. 注册表修复工具在哪里找
  15. mysql 5.6 msvcr100_mysql 5.6.46 安装到winserver2012(x64) 遇到 MSVCR100.dll is missing
  16. Groundhog Chasing Death
  17. 想玩IEO又怕跑得慢?LBank的“锁仓释放”了解下
  18. 电脑崩溃?黑客最爱邮件入侵方式,在双十一也要保护好网络安全!
  19. ajax的常用api测试
  20. 微信小程序中根据字母选择城市

热门文章

  1. 拓扑之homeomorphic
  2. android 将bitmap存为 bmp格式图片大小,把bitmap保存成 BMP的格式 并且位深度为1
  3. python中split拆分数组_Python 数组分割
  4. PHP怎么接收字符串,求大神救命!!php接收到是空的字符串
  5. 第一章踏上python之旅_仙侠旅人传
  6. Star Schema完全参考手册学习笔记九
  7. Stanford CS230深度学习(四)TensorFlow2.1
  8. 集成学习——XGBoost原理理解
  9. Redis基础(二)——通用命令和配置
  10. GitOps:Weaveworks通过开发者工具实现CI/CD