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 块

解释:
在这里插入图片描述
示例:
每当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;

触发器的应用场景:

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

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

  • 行级触发器会引发行级锁(锁行数据)
  • 语句级触发器可能会引起表级锁(锁表)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值