oracle触发器

触发器

说明

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

触发器的类型

语句级触发器

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

行级触发器(FOR EACH ROW)

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

触发器作用

1、数据确认。例如,增加工资不能低于原工资。

2、实施复杂的安全性检查。例如,周末禁止更改或新增数据。

3、做审计,跟踪表上所做的数据操作等。例如,操作记录。

4、数据的备份和同步。

创建触发器

  1. CREATE [or REPLACE] TRIGGER 触发器名
  2.   (BEFORE|AFTER)
  3.   (DELETE|INSERT|UPDATE[OF 列名])
  4.   [FOR EACH ROW[WHEN(条件)]]
  5. PLSQL 块

创建一个非工作时间不能修改数据的触发器。

  1. --获取当前是几点
  2. to_char(sysdate,'hh24')
  3. --将字符转换为数字
  4. to_number(to_char(sysdate,'hh24'))
  5. --判断非工作时间
  6. not (to_number(to_char(sysdate,'hh24')) between 9 and 17)
  7. --阻止执行
  8. raise_application_error(-20000,'非工作时间禁止修改数据');

在触发器中阻止SQL继续执行的方法,抛出一个错误。错误号码应该在-20000到-20999之间,否则提示"错误号参数超出范围"。

  1. create or replace
  2. trigger mytrigger
  3. before insert
  4. on table_001
  5. declare
  6. begin
  7.   if not (to_number(to_char(sysdate,'hh24')) between 9 and 17) then
  8.     raise_application_error(-20000,'非工作时间禁止更新数据');
  9.   end if;
  10. end;

创建一个增加工资不能低于原工资的触发器。

  1. declare
  2. begin
  3.   if 新工资 < 原工资 then
  4.     raise_application_error(-20001,'工资不能低于原工资');
  5.   end if;
  6. end

触发语句与伪代记录变量的值。

触发语句

:old

:new

insert

所有字段都是空(null)

将要插入的数据

update

更新以前该行的值

更新后的值

delete

删除以前该行的值

所有字段都是空(null)

  1. create or replace trigger checkSal
  2. before update
  3. on table_002
  4. for each row
  5. declare
  6. begin
  7.   if :new.sal < :old.sal then
  8.     raise_application_error(-20001,'涨工资不能低于原工资');
  9.   end if;
  10. end;
  11. /

查看所有的触发器对象。

  1. select * from user_triggers;

删除触发器。

  1. drop trigger checkSal;

 

原文地址:https://www.cnblogs.com/yinshoucheng-golden/p/8277980.html