触发器

触发器

触发器在数据库中以独立的对象存储,它与存储过程不同的是,存储过程通过其它程序来启动运行或直接启动运行,而触发器是由一个事件来启动运行。即触发器是当某个事件发生时自动地隐式运行。并且,触发器不能接收参数。所以运行触发器就叫触发或点火。ORACLE 事件指的是对数据库的表进行的INSERT、UPDATE 及 DELETE 操作或对视图进行类似的操作。

触发器组成

  • 触发事件:即在何种情况下触发trigger。例如INSERT、UPDATE 及 DELETE
  • 触发时间:是在触发事件发生之前(BEFORE)还是之后(AFTER)触发
  • 触发器本身:即触发之后的目的和意图, 触发器本身要做的事。例如:PL/SQL 块
  • 触发频率:语句级(STATEMENT)触发器和行级(ROW)触发器
    • 语句级(STATEMENT)触发器:是指当某触发事件发生时,该触发器只执行一次
    • 行级(ROW)触发器:是指当某触发事件发生时,对受到该操作影响的每一行数据,触发器都单独执行一

创建触发器

create or replace trigger name_trigger

​ before/after insert/update/delete of(列) on 表名 (for each row)

trigger_body;

触发器名可以和表或过程有相同的名字,但在一个模式中触发器名不能相同。

触发器体内的 SELECT 语句只能为 SELECT … INTO …结构,或者为定义游标所使用的 SELECT 语句。

触发器中不能使用数据库事务控制语句 COMMIT; ROLLBACK, SVAEPOINT 语句。调用的过程或函数也不能使用。

触发器的触发顺序

1.执行 BEFORE 语句级触发器;

2.对与受语句影响的每一行:
执行 BEFORE 行级触发器
 执行 DML 语句
 执行 AFTER 行级触发器

3.执行 AFTER 语句级触发器

每张表最多可建立 12 种类型的触发器:
BEFORE INSERT
BEFORE INSERT FOR EACH ROW
AFTER INSERT
AFTER INSERT FOR EACH ROW

BEFORE UPDATE
BEFORE UPDATE FOR EACH ROW
AFTER UPDATE
AFTER UPDATE FOR EACH ROW

BEFORE DELETE
BEFORE DELETE FOR EACH ROW
AFTER DELETE
AFTER DELETE FOR EACH ROW

:NEW , :OLD

:NEW 修饰符 访问操作完成后的列的值

:OLD 修饰符 访问操作完成前的列的值

insertupdatedelete
:OLDnull有效
:NEW有效有效

行级触发器:

create or replace trigger del_emp 
       after delete on emp for each row 
begin
  insert into emp_del (employee_id,last_name,hire_date,job_id,salary,department_id) 
  values (:old.employee_id,:old.last_name,:old.hire_date,:old.job_id,:old.salary,:old.department_id);
  dbms_output.put_line('触发del_emp');
end;

语句级触发器:

create or replace trigger del_emp1
       after delete on emp 
begin
  insert into emp_del (employee_id,last_name,hire_date,job_id,salary,department_id) 
  values (1,1,sysdate,1,1,1);
end;

例题:建立触发器,当修改emp中的salary大于或等于3000时触发

create or replace trigger update_emp  
      after update on emp for each row
begin
  if :new.salary-:old.salary >=3000 then
    dbms_output.put_line(:new.employee_id|| '涨工资啦!');
  end if;
end;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值