Oracle触发器的使用详解
作者:雷神乐乐
这篇文章主要介绍了Oracle触发器的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
1.Oracle触发器简介
触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行。
因此触发器不需要人为的去调用,也不能调用。
触发器的触发条件,其实在定义的时候就已经设定好了。
这里面需要说明一下:触发器可以分为语句级触发器和行级触发器。
简单的说就是:
- 语句级的触发器可以在某些语句执行前或执行后被触发;
 - 而行级触发器则是在定义的了触发的表中的行数据改变时就会被触发一次。
 
2.语句级触发器和行级触发器具体举例
- 在一个表中定义的语句级的触发器,当这个表被删除时,程序就会自动执行触发器里面定义的操作过程。这个就是删除表的操作就是触发器执行的条件了。
 - 在一个表中定义了行级的触发器,那当这个表中一行数据发生变化的时候,比如删除了一行记录,那触发器也会被自动执行了。
 
3.触发器的语法
create [or replace] TRIGGER 触发器名 触发时间 触发事件 on 表名 [for each row] begin pl/sql语句 end
语法参数:
- 触发器名:触发器对象的名称。由于触发器是数据库自动执行的,因此该名称只是一个名称,没有实质的用途。
 - 触发时间:指明触发器何时执行,该值可取:
 - before:表示在数据库动作之前触发器执行;
 - after:表示在数据库动作之后触发器执行。
 - 触发事件:指明哪些数据库动作会触发此触发器:
 - insert:数据库插入会触发此触发器;
 - update:数据库修改会触发此触发器;
 - delete:数据库删除会触发此触发器。
 - 表 名:数据库触发器所在的表。
 - for each row:对表的每一行触发器执行一次。如果没有这一选项,则只对整个表执行一次。
 
-- 禁用触发器 ALTER trigger t_1 ENABLE; -- 启用触发器 ALTER trigger t_1 DISABLE; ---删除触发器 DROP trigger t_1;
4.语句级触发器案例
在修改表emp之前触发,目的是不允许在星期四修改表
---RAISE_APPLICATION_ERROR 是触发一个异常报错指令 ---RAISE_APPLICATION_ERROR(自定义的一个异常码,异常说明)
select to_char(sysdate,'DY') FROM DUAL; -- 星期四
create or replace trigger t_1
  before update or insert or delete 
  -- 语句触发器,它将在 EMP 表的 INSERT、UPDATE 或 DELETE 操作之前触发。
on emp  -- 指定触发器应用于 EMP 表
  for each row
begin
  if to_char(sysdate, 'DY') = '星期四' then
    RAISE_APPLICATION_ERROR(-20001, '不允许在星期四修改表emp');
  end if;
end;
 
-- 测试
insert into emp (empno, ename) values (1111, 'AA');
5.行级触发器案例
创建触发器,比较emp表中更新的工资不能比原来的工资低
create table emp_sal as select * from emp;
create table emp_923 as select * from emp where 1=2;
create or replace trigger emp_sal_comp_sal_trigg
  before update on emp_sal
  for each row
begin
  if :old.sal > :new.sal then
    RAISE_APPLICATION_ERROR(-20002, '工资不能比之前少');
  else
    insert into emp_923 (empno, sal) values (:old.empno, :old.sal);
  end if;
end;- :old.和:new.不能出现在表级触发器中
 - commit不能放在触发器中
 
select * from emp_sal;

---修改 EMP_SAL 的数据,看看是否会触发异常 update emp_sal set sal=4000 where empno=7788; commit;

修改成功后,emp_923表中会存入旧值:
select * from emp_923;

修改的工资比原来更低:
update emp_sal set sal=1000 where empno=7788; commit;
抛出异常:

测试删除的触发器:
CREATE TABLE EMP_819 AS SELECT * FROM EMP;
CREATE OR REPLACE TRIGGER EMP819_DELETE
  BEFORE DELETE ON EMP_819
  FOR EACH ROW
BEGIN
  ---在删除数据之前往 EMP_923 这张备份表里插入要被删除的数据
  INSERT INTO EMP_923
    (EMPNO, ENAME, SAL)
  VALUES
    (:OLD.EMPNO, :OLD.ENAME, :OLD.SAL);
END;
----验证触发器
DELETE FROM EMP_819 T WHERE T.EMPNO = 7788;
COMMIT;---验证数据 SELECT * FROM EMP_819;

SELECT * FROM EMP_923;

总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
