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;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329310.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IIS负载均衡-Application Request Route详解第四篇:使用ARR实现三层部署架构

本篇的主要目的是带领大家一起来使用ARR来实现一个三层部署架构。这里的三层部署架构主要是由:服务层,应用程序服务器层已经数据层实现。如下图所示: 每次一提到“层”这个字的时候,似乎感觉这个字特别的惹火。很多朋友开始讨论起…

c遗传算法的终止条件一般_KDD比赛之遗传算法(举例理解)

求最大值问题是这样的:求解函数 f(x) x 10*sin(5*x) 7*cos(4*x) 在区间[0,9]的最大值。这个函数大概长这样:那么如何应用遗传算法如何来找到这个奇怪的函数的最大值呢?事实上,不管一个函数的形状多么奇怪,遗传算法都…

6.elasticsearch查询与过滤上下文(query context与filter contenxt)以及term术语查询

【README】 1.本文总结自: Query and filter context | Elasticsearch Guide [7.2] | Elastichttps://www.elastic.co/guide/en/elasticsearch/reference/7.2/query-filter-context.html2.文档相关性分数是否被计算,取决于查询子句是在查询上下文&…

Oracle入门(十四.22)之创建DDL和数据库事件触发器

一、什么是DDL和数据库事件触发器?DDL语句触发DDL触发器:CREATE,ALTER或DROP。 数据库事件触发器由数据库中的非SQL事件触发,例如: •用户连接到数据库或与数据库断开连接。 •DBA启动或关闭数据库。•用户会话中引发了…

Visual Studio上开发Python?你不可不知道的六大功能!

Visual Studio 2013/2015 搭配 Python Tools for Visual Studio 扩充套件让 Visual Studio 能提供对 Python 程序语言高度整合的开发环境,并完整发挥 Visual Studio 强大的功能,协助您在 Visual Studio 内开发 Python 程序上如虎添翼,提升开发…

qt中sendevent_Qt中postEvent和sendEvent函数

Qt中postEvent和sendEvent函数部分内容参考http://blog.csdn.net/lvmengzou/article/details/65450908qt事件循环需要维护一个事件队列,在Qt的main函数中最后一般调用QApplication::exec()成员函数来保持程序对事件队列的处理,exec()的实质是不停调用pro…

IIS负载均衡-Application Request Route详解第五篇:使用ARR来配置试点项目

看到本篇的题目,大家可能感到有点奇怪!下面,我们就来看看这到底是什么意思。 大家可能遇到过这样的一种情况:希望根据某些请求用户的特性,将用户的请求导向不同的站点(请大家这里区分“亲缘性”的概念&…

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

一、触发器需要特权要在模式中创建触发器,需要: •CREATE TRIGGER系统特权 •触发器主体中引用的其他架构中的对象的普通对象特权(SELECT,UPDATE,EXECUTE等) •与触发器关联的表或视图上的ALTER特权。触发器…

为什么哲学是最难的学科_什么是哲学哲学对大师来说可能非常理论化,没有一定哲学基础肯能很难 爱问知识人...

我的总结是科学哲学是从哲学角度考察科学的一门学科。它以科学活动和科学理论为研究对象,探讨科学的本质、科学知识的获得和检验、科学的逻辑结构等有关科学认识论和科学方法论的基本问题。哲学是什么?这是一个问题,一个既简单又复杂的问题。…

8.es更新文档通过版本号实现并发控制

【README】 1.本文介绍了es更新文档时的并发控制策略;2.通过版本号实现并发控制(类似于mysql中基于版本号的乐观锁);3.Es为支持并发控制,为每篇文章设置了版本号_version。初始值为1,每更新1次加1。…

Oracle入门(十五)之数据库锁

一、锁的概念 锁是数据库用来控制共享资源并发访问的机制。锁用于保护正在被修改的数据直到提交或回滚了事务之后,其他用户才可以更新数据二、锁定的优点 一致性 - 一次只允许一个用户修改数据完整性 - 为所有用户提供正确的数据。如果一个用户进行了修改并保存&a…

.NET 和 Mono 的一点历史

提到微软公司研发 .NET Framework 的初衷,难免要提到 SUN 公司1995年推出的 Java 语言。由于 Java 在业界得到了广泛的支持而且迅速建立了庞大的生态系统,微软也不得不考虑如何加以应对,毕竟自己手里的 Visual Basic 和 Visual C 和 Java 一比…

lisp 角平分线_证明冯奥贝尔定理的3种方法

怎样证明冯奥贝尔定理?Von.Aubel定理: 以任意四边形ABCD的边为斜边作四个转向相同的等腰直角三角形ΔABE,ΔBCF,ΔCDG,ΔDAH。则:EGFH,EG⊥FH。关于上述定理的几点说明:(1),条件是任意四边形,所…

java迭代实现二叉树先中后序遍历(非递归)

【README】 本文复习了通过java迭代实现 二叉树先序,中序,后序遍历; 本文引入了 栈,替换了递归,对二叉树进行遍历; 补充:使用递归遍历二叉树缺点: 众所周知,每次递归…

漫画:什么是分布式锁

转载自 漫画:什么是分布式锁分布式锁的实现有哪些?1.Memcached分布式锁利用Memcached的add命令。此命令是原子性操作,只有在key不存在的情况下,才能add成功,也就意味着线程得到了锁。2.Redis分布式锁和Memcached的方式…

程序员求职面试三部曲之一:选择合适的工作单位

前不久在知乎上看到一个话题,大概是说中国比国外好的有哪些方面,网友们例举了一大堆,其中有一条是说“在中国找工作比较容易”。 是的,特别对于我们IT从业者来说,找工作真的是小菜一碟;只要肯在网络上公开简…

处理api返回的数据_API 乐队指挥家,网关服务正式上线

随着知晓云小伙伴们业务的发展,对我们服务的支持又有了新的要求,比如在对接第三方服务时,需要自定义数据结构等。为此,经过 32 次的需求讨论会以及工程师们的紧张开发后,知晓云 API 网关诞生了。你可以通过可视化界面配…

数据结构排序总结

【0】README 0.1) 本文总结于 数据结构与算法分析个人的学习心得体会,源代码均为原创; 0.2) 本文列出了数据结构中基本上所有的数据结构排序算法, 整理了相关的博文(源代码); 0.3…

IIS负载均衡-Application Request Route详解第六篇:使用失败请求跟踪规则来诊断ARR

失败请求跟踪规则(FailedRequest Tracing Rules)是IIS7中对请求处理进行诊断的强大的工具。我们本篇文章将会带领大家一步步的来配置失败请求跟踪规则,并且告诉大家如何使用这些信息来诊断ARR。 要真正的理解本篇文章要讲述的知识&#xff0c…

减一天 日期函数_一文掌握excel中的日期函数

在excel中,因为日期的特殊性,大部分关于日期的运算都要用到特有的函数。对于大多数小伙伴们可能没有专门去学习过日期函数都有哪些?如何运用?可以实现什么样的功能?今天小编就为大家整理出来并详细介绍一下常用的日期函…