一、什么是DML触发器?

DML触发器是执行SQL DML语句(INSERT,UPDATE或DELETE)时自动触发(执行)的触发器。 您可以通过两种方法对DML触发器进行分类:
•执行时间:BEFORE,AFTER或INSTEAD触发DML语句。
•它们执行的次数:一次对于整个DML语句(一个语句触发器),或者对于受DML语句影响的每一行一次(一行

触发)。

二、创建DML语句触发器

CREATE [OR REPLACE] TRIGGER trigger_name
timing
event1 [OR event2 OR event3] ON object_name
trigger_body

•timing:当触发器触发与触发事件有关时。 值在之前,之后或停止。

•event:哪个DML操作导致触发器触发。 值是INSERT,UPDATE [OF列]和DELETE。

•object_name:与触发器关联的表或视图。

•trigger_body:由触发器执行的操作在匿名块中定义。

(1)语句触发时序

触发器何时应该触发?
•BEFORE:在表格上的触发DML事件之前执行触发器主体。
•AFTER:在表格上触发DML事件后执行触发器主体。
•INSTEAD OF:在视图上执行触发器主体而不是触发DML事件。
编程要求将决定使用哪一个。

(2)触发时间和事件示例

第一个触发器在员工的工资更新之前立即执行:

CREATE OR REPLACE TRIGGER sal_upd_trigg
BEFORE UPDATE OF salary ON employees
BEGIN ... END;

员工被删除后立即执行第二个触发器:

CREATE OR REPLACE TRIGGER emp_del_trigg
AFTER DELETE ON employees
BEGIN ... END;

可以限制UPDATE触发器更新特定列或列:

CREATE OR REPLACE TRIGGER sal_upd_trigg
BEFORE UPDATE OF salary, commission_pct ON employees
BEGIN ... END;

触发器可能有多个触发事件:

CREATE OR REPLACE TRIGGER emp_del_trigg
AFTER INSERT OR DELETE OR UPDATE ON employees
BEGIN ... END;

三、怎样使触发器触发?

(1)声明触发器:
•触发语句的每次执行仅触发一次
•是DML触发器的默认类型
•即使没有行受到影响,也会触发一次

CREATE OR REPLACE TRIGGER log_emp_changes
AFTER UPDATE ON employees BEGIN
INSERT INTO log_emp_table (who, when)VALUES (USER, SYSDATE);
END;

现在执行UPDATE语句:

UPDATE employees SET ... WHERE ...;

触发器触发多少次,如果UPDATE语句修改三行? 十行? 一行?没有行?

(2)触发器何时触发

此幻灯片显示与事件INSERT INTO departments关联的语句触发器的触发顺序:

INSERT INTO departments(department_id,department_name, location_id)
VALUES (400, 'CONSULTING', 2500);

四、触发器触发序列

即使触发的DML语句影响许多行,语句触发器也只触发一次:

UPDATE employeesSET salary = salary * 1.1WHERE department_id = 50;

(1)DML语句触发器示例1

每当一行或多行成功插入到EMPLOYEES中时,此语句触发器就会自动将一行插入到日志记录表中。

(2)DML语句触发器示例2

每次在DEPARTMENTS表上成功执行DML操作时,此语句触发器都会自动向日志记录表中插入一行。

CREATE OR REPLACE TRIGGER log_dept_changes
AFTER INSERT OR UPDATE OR DELETE ON DEPARTMENTS
BEGIN
INSERT INTO log_dept_table (which_user, when_done)VALUES (USER, SYSDATE);
END;

(3)DML语句触发器示例3
这个例子展示了如何使用DML触发器来强制执行复杂的业务规则,这些规则不能被约束强制执行。
希望在正常工作日(星期一至星期五)允许INSERT进入EMPLOYEES表,但在周末(周六和周五)禁止INSERT

星期日)。

如果用户试图在周末期间向EMPLOYEES表中插入一行,则用户将看到错误消息,触发器失败,并且触发语句被回滚。以下显示了此示例所需的触发器代码。

CREATE OR REPLACE TRIGGER secure_emp
BEFORE INSERT ON employees
BEGIN
IF TO_CHAR(SYSDATE,'DY') IN ('SAT','SUN') THENRAISE_APPLICATION_ERROR(-20500,'You may insert into EMPLOYEES'||' table only during business hours');END IF;
END;

(4)测试SECURE_EMP
用户尝试在周末插入一行:

INSERT INTO employees (employee_id, last_name,
first_name, email, hire_date, job_id, salary, department_id)
VALUES (300, 'Smith', 'Rob', 'RSMITH', SYSDATE,'IT_PROG', 4500, 60);
ORA-20500: You may insert into EMPLOYEES table only during business
hours.
ORA-06512: at “USVA_TEST_SQL01_T01.SECURE_EMP”, line 4
ORA_04088: error during execution of trigger
‘USVA_TEST_SQL01_T01.SECURE_EMP’
2. VALUES (300, ‘Smith’, ‘Rob’, ‘RSMITH’, SYSDATE, ‘IT_PROG’, 4500,
60);

(5)最后一个例子

该触发器不能成功编译。 为什么不?

CREATE OR REPLACE TRIGGER log_dept_changes
AFTER INSERT OR UPDATE OR DELETE ON DEPARTMENTS
BEGIN
INSERT INTO log_dept_table (which_user, when_done)VALUES (USER, SYSDATE);COMMIT;
END;

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

  1. Oracle入门(十四.21)之创建DML触发器:第二部分

    一.使用条件谓词 在上文中,看到了一个触发器,可以防止在周末插入EMPLOYEES: CREATE OR REPLACE TRIGGER secure_emp BEFORE INSERT ON emp ...

  2. Oracle入门(十四.23)之管理触发器

    一.触发器需要特权 要在模式中创建触发器,需要: •CREATE TRIGGER系统特权 •触发器主体中引用的其他架构中的对象的普通对象特权(SELECT,UPDATE,EXECUTE等) •与触发器 ...

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

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

  4. 第十四届蓝桥杯模拟赛第一期试题【Java解析】

    目录 A 二进制位数 问题描述 答案提交 参考答案 解析 B 晨跑 问题描述 答案提交 参考答案 解析 C 调和级数 问题描述 答案提交 参考答案 解析 D 山谷 问题描述 答案提交 参考答案 解析 ...

  5. 2022 第十四届蓝桥杯模拟赛第一期(题解与标程)

    第十四届蓝桥杯模拟赛第一期 1. 二进制位数 问题描述 答案提交 参考答案 2. 晨跑 问题描述 答案提交 参考答案 3. 调和级数 问题描述 答案提交 参考答案 程序验证 4. 山谷 问题描述 答案 ...

  6. java怎样用类模板创建对象_java入门(十四) | 面向对象(OOP)之类和对象

    上一期是变量,在java中变量总是无处不在,而变量其意就是可以改变的数,在一般情况下我们可以以变量类型,变量名,变量值来描述它 这一期是给面向对象(OOP)开了一个头,对他的概念,三大特征有了一个基础 ...

  7. Node学习十四 —— 使用node创建HTTP请求

    创建HTTP连接 Node擅长处理I/O操作,所以它不仅合适提供HTTP服务,也适合使用这些服务.接下来你将学习使用http模块和第三方模块执行和控制http请求. 在HTTP协议中,有两个重要的属性 ...

  8. Oracle入门(四)之查询基本信息

    一.查询基本信息 (1) 查询实例服务 SQL> show parameter instance name (2)查询数据库名字 SQL> show parameter db_name; ...

  9. Helm 3 完整教程(二十四):创建和使用子 chart

    推荐阅读 Helm3(K8S 资源对象管理工具)视频教程:https://edu.csdn.net/course/detail/32506 Helm3(K8S 资源对象管理工具)博客专栏:https: ...

最新文章

  1. 洛谷1216 数字三角形
  2. Open×××的Linux内核版,鬼魅的残缺 part I:The PROTOCOL
  3. Serverless 应用引擎产品的流量负载均衡和路由策略配置实践
  4. 多视图几何总结——基础矩阵、本质矩阵和单应矩阵的求解过程
  5. OpenCV消除傅立叶域中的周期性噪声的实例(附完整代码)
  6. MongoDB3.4 版本新节点同步的一点惊喜
  7. 【ACM】nyoj_305_表达式求值_201308081018
  8. AudioBufferSourceNode
  9. shell数组使用技巧
  10. html2canvas截长图
  11. 海外客户如何进行问卷调查
  12. -XX:SoftRefLRUPolicyMSPerMB从名字看不出什么意思?【官文解读】
  13. Redis 各种用法总结,你知道几种?
  14. 一着不慎被蛇咬,最近半月终出坑
  15. 招商银行信用卡中心笔试编程题 - 序列找数
  16. File.exists()Directory.exists()
  17. NSGA-II算法阅读笔记
  18. Qt下的国际化方法—翻译文件(.ts .qm文件)的使用
  19. 深入Python进程间通信原理
  20. A-LEVEL经济知识点讲解:国际收支的结构

热门文章

  1. 每天一小时python官方文档学习(一)————python的简单介绍
  2. 汇编语言中常见的标志位: CF, PF, AF, ZF, SF,TF,IF,DF, OF
  3. [JS-BOM]BOM_Location地址栏对象
  4. [剑指offer]面试题10:二进制中1的个数
  5. php给html传值,PHP传值到不同页面的三种常见方式及php和html之间传值问题_PHP
  6. android中弹出窗口,如何在Android中创建弹出窗口(PopupWindow)
  7. 拦截器如何获取@requestbody_分布式系统中如何优雅地追踪日志(原理篇)
  8. DBN训练学习-A fast Learning algorithm for deep belief nets
  9. ABC 189 E - Rotate and Flip 矩阵转移
  10. Gym - 100952H--H. Special Palindrome--dp整数划分(模板)