代码改变世界

Oracle的触发器

2017-07-14 20:38  tlnshuju  阅读(215)  评论(0编辑  收藏  举报

过去做项目。

都是前端后台的编码。由于数据库都让项目经理给写好的。自己对于数据库并没有多少优化,时间久了,反而把数据库的知识给淡忘了,近期的项目用到的是Oracle数据库,大家都知道。用到这个数据库。就是数据量比較大的项目了。对于优化就有必要了。因此自己下班后抽出时间复习一下,并把这个记录下来,不仅仅是分享给大家,还能以后自己再次复习。若我讲得不正确,请留言更正,本人会虚心接受并改更,这样才干进步。

1.什么是触发器

每当一个特定的数操作语句(insert,update,delete)在指定的表上发出时,Oracle自己主动的运行触发器中定义的语句序列。

这个定义,大家看到就能明确触发器的作用了,增删改查,为什么触发器没有查询呢。由于Oracle的触发器是针对数据变动时所触发的一种待定行动。

比方你删除了一个表中的字段,删除触发器就会启动,运行他的命令。

同理。改动和添加方法也是一样。仅仅要你运行了增删改方法,从而改变了表的数据时。你所设定对应的触发器就会运行。

样例:每当成功插入新员工后,自己主动打印一句话“成功插入新员工”;
create trigger saynewemp<span style="white-space:pre">	</span>//创建一个触发器 <span style="font-family: Arial, Helvetica, sans-serif;">saynewemp是触发器的名字</span>
after insert<span style="white-space:pre">			</span>//运行插入方法后触发
on emp<span style="white-space:pre">				</span>//针对是哪个表
declare<span style="white-space:pre">				</span>//声明
begin<span style="white-space:pre">				</span>//開始
   dbms_output.put_line("成功插入新员工")<span style="white-space:pre">	</span>//触发时打印一句话
end;<span style="white-space:pre">						</span>//结果
一个员工表的插入触发器就写好了。仅仅要我们对员工表运行insert插入操作后,就会运行触发器中的行为,如上所看到的,会自己主动打印一句话。

2.触发器的应用场景

  1. 复杂的安全性检查
  2. 数据的确认
  3. 数据库的审计
  4. 数据的备份和同步
第一种:复杂的安全性检查,就比方我们项目中的需求。假设有周末放假不能对数据库进行改变。那我们就能够用触发器对他进行限制
另外一种:数据的确认,比方你拿100块买1块钱的东西的时候。老板找钱给你时,你是不是要数一数,确认一下是否有没有错呢
第三种:数据库的审计,他是针对数据库的操作记录。能够记录谁对数据库进行了什么操作。Oracle已经有自带的这样的功能。我们也能够自己用触发器实现他
第四种:数据的备份和同步,这个也好理解。就是当你对数据库进行操作以后,就触发备份操作。这有点像单机游戏英雄无敌里的游戏保存一样。当轮到你操作时。就会自己主动执 行一次自己主动保存。

3.创建.触发器的语法

CREATE[or REPLACE]TRIGGER 触发器的名字<span style="white-space:pre">	</span>//创建一个触发器
{BEFORE|AFTER}<span style="white-space:pre">				</span>//触发器运行的顺序。是方法前还是方法后运行
{DELETE|INSERT|UPDATE(OF 列名)}<span style="white-space:pre">		</span>//给哪个方法设置触发器,在UPDATE方法中,能够用OF指明哪一列名
ON 表名<span style="white-space:pre">					</span>//哪个表
[FOR EACH ROW[WHEN(条件)]]<span style="white-space:pre">		</span>//假设有FOR EACH ROW,那就是行级触发器。反之,就是语句触发器
PLSQL块<span style="white-space:pre">					</span>//运行块
  1. 语句级触发器:在指定的操作语句操作之前或之后运行一次。无论这条语句影响了多少行,仅仅运行一次。

  2. 行级触发器:触发语句作用的每一条记录都被触发。在行级触发器中使用 :old 和 :new伪记录变量,识别值的状态
是不是非常抽象呢。事实上大家从名字就能够清楚知道他们的分别。

我在以下举例说明吧。

样例:我们要在把员工表中的一个字段数据(有三条)插入到新的一个表中。
<span style="white-space:pre">	</span>INSERT INTO EMP10 SELECT * FROM EMP WHERE NAME = 10;
假设是语句级触发器的话,仅仅触发一次。由于语句级触发器:针对的是表,
而行级触发器。前面也说了,是三条记录,自然会触发三次行级触发器,也就是,针对的是行。就如前面的语法中。行级触发器FOR EACH ROW 语句,后面也能够加WHEN的条件,能够指定哪一行。



 这些是触发器的介绍。看到这里。大家就能明确触发器是什么,干什么用的,在什么情景下使用了。尽管这篇非常基础,但对于新人还是有些帮助的。