Oracle触发器2-DML触发器
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触发器相关推荐
- DDL触发器与DML触发器比较
DML触发器 DML触发器就是普通的 INSERT / UPDATE / DELETE 触发器. DDL触发器就是一些特有的 DDL 语句的触发器. 例如:登陆到服务器的触发, 创建数据库的触发. ...
- oracle创建dml触发器,Oracle数据库创建DML触发器
触发器的基本分类 1.行触发器:数据库表中的每一行有变化都会触发一次触发器代码 2.语句触发器:与语句所影响的行数无关,仅触发一次 3.BEFORE触发器:在DML语句执行之前触发 4.ALFTER触 ...
- Oracle入门(十四.20)之创建DML触发器:第一部分
一.什么是DML触发器? DML触发器是执行SQL DML语句(INSERT,UPDATE或DELETE)时自动触发(执行)的触发器. 您可以通过两种方法对DML触发器进行分类: •执行时间:BEFO ...
- oracle dml触发器 获取当前执行sql语句,Oracle DML触发器
DML触发器的要点 DML触发器是定义在表上的触发器,由DML事件引发.编写DML触发器的要素是: * 确定触发的表,即在其上定义触发器的表. * 确定触发的事件,DML触发器的触发事件有INSERT ...
- mysql 触发器不能同时 insert or update or delete_运维日记|SQL server 那点事——DML触发器...
11月19日,21点,小编正六指霸屏,决赛圈1V4,忽然,电话响了,这种感觉很熟悉,不错,上次差点推掉对面水晶的那一幕又上演了--作为一名美创的员工,客户才是第一位,我毫不犹豫的摁下了接听键. X ...
- oracle行级的触发器,Oracle触发器Trigger2行级
create table trigger_t2( id int, name varchar(30), age int ); /* --创建一个before update的触发器-控制每一行,行级 -- ...
- sqlserver 触发器 update_运维日记| SQL server 那点事——DML触发器
各位新朋友-记得先点蓝字关注我哦- 11月19日,21点,小编正六指霸屏,决赛圈1V4,忽然,电话响了,这种感觉很熟悉,不错,上次差点推掉对面水晶的那一幕又上演了--作为一名美创的员工,客户才是第一位 ...
- PL/SQL -- DML 触发器
--======================= -- PL/SQL --> DML 触发器 --======================= 何谓触发器?简言之,是一段命名的PL/SQL代 ...
- Oracle学习笔记十三 触发器
2019独角兽企业重金招聘Python工程师标准>>> 简介 触发器是当特定事件出现时自动执行的存储过程,特定事件可以是执行更新的DML语句和DDL语句,触发器不能被显式调用. 触发 ...
- 杂谈--DML触发器学习
触发器按类型分为三类: 1. DML 触发器,在数据变更时触发: 2. DDL 触发器,在修改数据库级别或实例级别对象时触发: 3. Login 触发器,在用户登录时触发: 最常见的是DML触发器,D ...
最新文章
- 对话框中加入标签页的5种方法
- mysql 触发器 分行_mysql 触发器
- 经验分享:布线测试关键步骤有哪些 ?
- Spring框架中的9种设计模式汇总
- boost::hana::if_用法的测试程序
- 前端学习(3047):vue+element今日头条管理-使用table表格组件
- 上传文件的php代码,PHP实现大文件上传源代码
- oracle唯一索引能删除吗,Oracle:ora-02429:无法用于删除强制唯一/主键的索引 解决...
- 前端开发常用免费资源,显著提升工作效率
- Qt 信号-槽的同步与异步处理
- XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Korea
- SAPJCO3升级3.1后报错java.lang.UnsatisfiedLinkError: sapjco3.dll解决
- ffmpeg和JavaCV
- 注册表修复工具在哪里找
- mysql 5.6 msvcr100_mysql 5.6.46 安装到winserver2012(x64) 遇到 MSVCR100.dll is missing
- Groundhog Chasing Death
- 想玩IEO又怕跑得慢?LBank的“锁仓释放”了解下
- 电脑崩溃?黑客最爱邮件入侵方式,在双十一也要保护好网络安全!
- ajax的常用api测试
- 微信小程序中根据字母选择城市
热门文章
- 拓扑之homeomorphic
- android 将bitmap存为 bmp格式图片大小,把bitmap保存成 BMP的格式 并且位深度为1
- python中split拆分数组_Python 数组分割
- PHP怎么接收字符串,求大神救命!!php接收到是空的字符串
- 第一章踏上python之旅_仙侠旅人传
- Star Schema完全参考手册学习笔记九
- Stanford CS230深度学习(四)TensorFlow2.1
- 集成学习——XGBoost原理理解
- Redis基础(二)——通用命令和配置
- GitOps:Weaveworks通过开发者工具实现CI/CD