概念和作用
数据库触发器是一个与表相关联的、存储的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 块
解释:
示例:
每当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
- 在表现上
- 行级触发器,在每一行的数据进行操作的时候都会触发。
语句级触发器,对表的一个完整操作才会触发一次。
简单的说:行级触发器,是对应行操作的;语句级触发器,是对应表操作的。
行级别触发器的伪记录变量:
: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;
触发器的应用场景:
- 数据确认
- 实施复杂的安全性检查
- 做审计,跟踪表上所做的数据操作等
- 数据的备份和同步
但是要注意:触发器会引起锁,降低效率!使用时要慎重。如无必要,尽量不要使用触发器。
- 行级触发器会引发行级锁(锁行数据)
- 语句级触发器可能会引起表级锁(锁表)