oracle trigger 触发器,13oracle之触发器trigger

概念和作用

数据库触发器是一个与表相关联的、存储的PL/SQL程序。每当一个特定的数据操作语句(Insert,update,delete)在指定的表上发出时,Oracle自动地执行触发器中定义的语句序列。

解释:

首先,它也是一段plsql程序。

然后,它是来触发与表数据操作相关的(insert,update,delete)。

然后,在进行表数据操作的时候,会自动触发执行的一段程序。

换句话说:触发器就是在执行某个操作(增删改)的时候触发一个动作(一段程序)。

语法:

创建触发器语法:

CREATE [or REPLACE] TRIGGER 触发器名

{BEFORE | AFTER}

{DELETE | INSERT | UPDATE [OF 列名]}

ON 表名

[FOR EACH ROW [WHEN(条件) ] ]

PLSQL 块

解释:

20190826193848817.png

示例:

每当dept表中添加了一位新部门时,打印”成功插入新部门”

create or replace trigger tri_adddept

AFTER INSERT

on dept

declare

begin

dbms_output.put_line('插入了新部门');

end ;

--测试哈

SELECT * FROM dept;

INSERT INTO dept VALUES(80,'itcast1','上海');

SELECT * FROM dept;

触发器的类:

语句级触发器(表级触发器)

在指定的操作语句操作之前或之后执行一次,不管这条语句影响了多少行 。

行级触发器(FOR EACH ROW)

触发语句作用的每一条记录都被触发。在行级触发器中使用old和new伪记录变量, 识别值的状态。

语句级触发器和行级触发器的区别:

目标:演示语句级触发器和行级触发器的区别

复制出来一张表depttemp,分别建立语句级和行级触发器,然后进行批量插入操作测试。

CREATE TABLE depttemp AS SELECT * FROM dept WHERE 1<>1;

SELECT * FROM depttemp;

两个触发器编写:

–语句级别

create or replace trigger tri_adddepttemp_yuju

after insert on depttemp

declare

begin--plsql语句

dbms_output.put_line('成功插入了一个部门:语句级触发器触发了。。:');

end tri_adddepttemp_yuju;

–行级别:

create or replace trigger tri_adddepttemp_hangji

after insert on depttemp

for each row--行级触发器

declare

begin--plsql语句

dbms_output.put_line('成功插入了一个部门:行级触发器触发了。。:');

end tri_adddepttemp_hangji;

批量插入数据测试:

–先建立两种触发器

–批量插入数据

INSERT INTO depttemp SELECT * FROM dept;

语句级触发器和行级触发器区别:

在语法上

行级触发器就多了一句话:for each row

在表现上

行级触发器,在每一行的数据进行操作的时候都会触发。

语句级触发器,对表的一个完整操作才会触发一次。

简单的说:行级触发器,是对应行操作的;语句级触发器,是对应表操作的。

行级别触发器的伪记录变量:

2019082619445855.png

:new代表操作之后的数据,只出现在INSERT/UPDATE中,

:old代表操作(cud)之前的那条数据,出现在UPDATE/DELETE,

INSERT时:NEW表示新插入的行数据,UPDATE时:NEW表示要替换的新数据,:OLD表示要被更改的原来数据,DELETE时:OLD表示要被删除的数据。

示例:

--涨工资:涨后的工资不能少于涨前的工资

create or replace trigger tri_checkempsal

BEFORE UPDATE ON emp--更新之前拦截触发

for each row--行级触发器

declare

BEGIN

--如果涨后小于涨前,则,终止更新操作

IF :new.Sal<:old.sal then>

--终止程序继续运行,也就终止了更新操作了。 -20001-20999随便写

raise_application_error(-20008,'涨后的工资不能少于涨前的工资!!涨前的工资:'||:old.Sal||',涨后的工资:'||:new.sal);

--相当于抛出异常(throw),(使用了oracle内置的一个函数来抛出异常)

END IF;

end tri_checkempsal;

触发器的应用场景:

数据确认

实施复杂的安全性检查

做审计,跟踪表上所做的数据操作等

数据的备份和同步

但是要注意:触发器会引起锁,降低效率!使用时要慎重。如无必要,尽量不要使用触发器。

行级触发器会引发行级锁(锁行数据)

语句级触发器可能会引起表级锁(锁表)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值