Oracle入门(十四.20)之创建DML触发器:第一部分
一、什么是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触发器:第一部分相关推荐
- Oracle入门(十四.21)之创建DML触发器:第二部分
一.使用条件谓词 在上文中,看到了一个触发器,可以防止在周末插入EMPLOYEES: CREATE OR REPLACE TRIGGER secure_emp BEFORE INSERT ON emp ...
- Oracle入门(十四.23)之管理触发器
一.触发器需要特权 要在模式中创建触发器,需要: •CREATE TRIGGER系统特权 •触发器主体中引用的其他架构中的对象的普通对象特权(SELECT,UPDATE,EXECUTE等) •与触发器 ...
- oracle创建dml触发器,Oracle数据库创建DML触发器
触发器的基本分类 1.行触发器:数据库表中的每一行有变化都会触发一次触发器代码 2.语句触发器:与语句所影响的行数无关,仅触发一次 3.BEFORE触发器:在DML语句执行之前触发 4.ALFTER触 ...
- 第十四届蓝桥杯模拟赛第一期试题【Java解析】
目录 A 二进制位数 问题描述 答案提交 参考答案 解析 B 晨跑 问题描述 答案提交 参考答案 解析 C 调和级数 问题描述 答案提交 参考答案 解析 D 山谷 问题描述 答案提交 参考答案 解析 ...
- 2022 第十四届蓝桥杯模拟赛第一期(题解与标程)
第十四届蓝桥杯模拟赛第一期 1. 二进制位数 问题描述 答案提交 参考答案 2. 晨跑 问题描述 答案提交 参考答案 3. 调和级数 问题描述 答案提交 参考答案 程序验证 4. 山谷 问题描述 答案 ...
- java怎样用类模板创建对象_java入门(十四) | 面向对象(OOP)之类和对象
上一期是变量,在java中变量总是无处不在,而变量其意就是可以改变的数,在一般情况下我们可以以变量类型,变量名,变量值来描述它 这一期是给面向对象(OOP)开了一个头,对他的概念,三大特征有了一个基础 ...
- Node学习十四 —— 使用node创建HTTP请求
创建HTTP连接 Node擅长处理I/O操作,所以它不仅合适提供HTTP服务,也适合使用这些服务.接下来你将学习使用http模块和第三方模块执行和控制http请求. 在HTTP协议中,有两个重要的属性 ...
- Oracle入门(四)之查询基本信息
一.查询基本信息 (1) 查询实例服务 SQL> show parameter instance name (2)查询数据库名字 SQL> show parameter db_name; ...
- Helm 3 完整教程(二十四):创建和使用子 chart
推荐阅读 Helm3(K8S 资源对象管理工具)视频教程:https://edu.csdn.net/course/detail/32506 Helm3(K8S 资源对象管理工具)博客专栏:https: ...
最新文章
- 洛谷1216 数字三角形
- Open×××的Linux内核版,鬼魅的残缺 part I:The PROTOCOL
- Serverless 应用引擎产品的流量负载均衡和路由策略配置实践
- 多视图几何总结——基础矩阵、本质矩阵和单应矩阵的求解过程
- OpenCV消除傅立叶域中的周期性噪声的实例(附完整代码)
- MongoDB3.4 版本新节点同步的一点惊喜
- 【ACM】nyoj_305_表达式求值_201308081018
- AudioBufferSourceNode
- shell数组使用技巧
- html2canvas截长图
- 海外客户如何进行问卷调查
- -XX:SoftRefLRUPolicyMSPerMB从名字看不出什么意思?【官文解读】
- Redis 各种用法总结,你知道几种?
- 一着不慎被蛇咬,最近半月终出坑
- 招商银行信用卡中心笔试编程题 - 序列找数
- File.exists()Directory.exists()
- NSGA-II算法阅读笔记
- Qt下的国际化方法—翻译文件(.ts .qm文件)的使用
- 深入Python进程间通信原理
- A-LEVEL经济知识点讲解:国际收支的结构
热门文章
- 每天一小时python官方文档学习(一)————python的简单介绍
- 汇编语言中常见的标志位: CF, PF, AF, ZF, SF,TF,IF,DF, OF
- [JS-BOM]BOM_Location地址栏对象
- [剑指offer]面试题10:二进制中1的个数
- php给html传值,PHP传值到不同页面的三种常见方式及php和html之间传值问题_PHP
- android中弹出窗口,如何在Android中创建弹出窗口(PopupWindow)
- 拦截器如何获取@requestbody_分布式系统中如何优雅地追踪日志(原理篇)
- DBN训练学习-A fast Learning algorithm for deep belief nets
- ABC 189 E - Rotate and Flip 矩阵转移
- Gym - 100952H--H. Special Palindrome--dp整数划分(模板)