Oracle入门(十四.19)之触发器简介

一、触发器的需求

让我们从一个例子开始吧:一条业务规则规定,只要员工的工资发生变化,变更就必须记录在日志记录表中。
可以创建两个过程来执行此操作:

UPD_EMP_SAL更新工资,LOG_SAL_CHANGE将行插入日志表。可以从UPD_EMP_SAL中调用LOG_SAL_CHANGE,或者从调用环境中分别调用LOG_SAL_CHANGE。

但不必这样做。 相反,你创建一个触发器。 下一张幻灯片展示了如何。

一个简单的触发器的例子

从现在起,无论何时SQL语句更新薪水,该触发器都会自动执行,并将该行插入到日志表中。

CREATE OR REPLACE TRIGGER log_sal_change_trigg
AFTER UPDATE OF salary ON employees
BEGININSERT INTO log_table (user_id, logon_date)VALUES (USER, SYSDATE);
END;
说触发事件(更新工资)发生时触发器会自动触发(即执行)。 原因和结果:事件发生,触发器触发。


二、什么是触发器?

(1)数据库触发器:
•PL / SQL块是否与特定操作(事件)相关联,例如用户成功登录或对数据库对象(如表或视图)执行的操作
•每当发生相关操作时自动执行

•存储在数据库中在上一张幻灯片的示例中,触发器与此操作相关联:UPDATE OF salary ON employees


(2)应用程序与数据库触发器比较

无论何时在架构或数据库中发生数据事件(例如DML或DDL)或系统事件(例如连接用户或DBA关闭数据库),数据库触发器都会自动执行。 数据库触发器就像PL / SQL过程,函数和包一样被创建并存储在数据库中。 应用程序触发器在应用程序中发生特定事件时自动执行。 应用程序触发器广泛用于使用Oracle Forms Developer开发的应用程序。

(3)哪些事件会导致数据库触发器触发?

数据库中的以下事件可能导致触发器触发:
•表上的DML操作
•视图上的DML操作,带有INSTEAD OF触发器
•DDL语句,例如CREATE和ALTER

•数据库系统事件,例如用户登录或DBA关闭数据库时

(4)触发器的可能用途
可以使用触发器来:
•增强复杂的数据库安全规则
•自动创建审计记录
•执行复杂的数据完整性规则
•自动创建日志记录
•防止桌子意外掉落

•防止发生无效的DML交易

•自动生成派生列值
•维护同步表复制
•收集表访问统计信息

•在针对视图发布DML语句时修改表格数据


示例1:自动创建记录记录

数据库管理员想要在数据库中保存一个自动记录(在数据库表中),以及何时登录。 他/她可以创建日志表和合适的触发器,如下所示:

CREATE TABLE log_table (user_id VARCHAR2(30),logon_date DATE);
CREATE OR REPLACE TRIGGER logon_trigg
AFTER LOGON ON DATABASE
BEGININSERT INTO log_table (user_id, logon_date) VALUES (USER, SYSDATE);
END;
示例2:执行复杂的数据完整性规则

设想一条规则,规定员工的工作不能改变成员工过去已经完成的工作。

CREATE OR REPLACE TRIGGER check_sal_trigg
BEFORE UPDATE OF job_id ON employees
FOR EACH ROW
DECLAREv_job_count INTEGER;
BEGINSELECT COUNT(*) INTO v_job_countFROM job_historyWHERE employee_id = :OLD.employee_id  AND job_id = :NEW.job_id;IF v_job_count > 0 THENRAISE_APPLICATION_ERROR(-20201,'This employee has already done this job');END IF;
END;


三、触发指南

不要将触发器定义为复制或替换您可以通过其他方式轻松完成的操作。 例如,使用约束实现简单的数据完整性规则,而不是触发器。过度使用触发器会导致复杂的相互依赖关系,这可能难以维护。 仅在必要时使用触发器,并注意递归和级联效应。

通过创建在触发器主体中调用的存储过程或打包过程来避免冗长的触发器逻辑。


数据库触发器和存储过程的比较




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

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

相关文章

搜狐视频Redis私有云cachecloud开源了

项目地址:https://github.com/sohutv/cachecloud/ 一、CacheCloud是做什么的 CacheCloud提供一个Redis云管理平台:实现多种类型(Redis Standalone、Redis Sentinel、Redis Cluster)自动部署、解决Redis实例碎片化现象、提供完善统计、监控、运维功能、减…

springboot 订单重复提交_瞬间几千次的重复提交,我用Spring Boot+Redis扛住了

在实际的开发项目中,一个对外暴露的接口往往会面临,瞬间大量的重复的请求提交,如果想过滤掉重复请求造成对业务的伤害,那就需要实现幂等!我们来解释一下幂等的概念:任意多次执行所产生的影响均与一次执行的…

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

一、使用条件谓词 在上文中,看到了一个触发器,可以防止在周末插入EMPLOYEES: CREATE OR REPLACE TRIGGER secure_emp BEFORE INSERT ON employees BEGINIF TO_CHAR(SYSDATE,DY) IN (SAT,SUN) THENRAISE_APPLICATION_ERROR(-20500,You may ins…

【直播预告】创享未来 2016微软开发者峰会

感谢所有中国开发者对2016微软开发者峰会的热情关注,目前活动已经截止报名了,不过M姐为大家带来新的福利: 2016微软开发者峰会将全程线上直播! 2016微软开发者峰会将全程线上直播! 2016微软开发者峰会将全程线上直播…

定时任务重启后执行策略_C语言操作时间函数time.ctime,实现定时执行某个任务小例子...

时间操作函数在实际项目开发中会经常用到,最近做项目也正好用到就正好顺便整理一下。时间概述由上图可知:通过系统调用函数time()可以从内核获得一个类型为time_t的1个值,该值叫calendar时间,即从1970年1月1日的UTC时间从0时0分0妙…

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

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

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迭代实现 二叉树先序,中序,后序遍历; 本文引入了 栈,替换了递归,对二叉树进行遍历; 补充:使用递归遍历二叉树缺点: 众所周知,每次递归…