概念和作用

数据库触发器是一个与表相关联的、存储的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 块

解释:

13oracle之触发器trigger_数据操作


示例:

每当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;

触发器的类:


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

  • 触发语句作用的每一条记录都被触发。在行级触发器中使用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

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

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

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

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

13oracle之触发器trigger_触发器_02


: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;

触发器的应用场景:

  • 数据确认
  • 实施复杂的安全性检查
  • 做审计,跟踪表上所做的数据操作等
  • 数据的备份和同步

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

  • 行级触发器会引发行级锁(锁行数据)
  • 语句级触发器可能会引起表级锁(锁表)