oracle

关注公众号 jb51net

关闭
首页 > 数据库 > oracle > Oracle触发器

Oracle触发器的使用详解

作者:雷神乐乐

这篇文章主要介绍了Oracle触发器的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

1.Oracle触发器简介

触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行。

因此触发器不需要人为的去调用,也不能调用。

触发器的触发条件,其实在定义的时候就已经设定好了。

这里面需要说明一下:触发器可以分为语句级触发器和行级触发器。

简单的说就是:

2.语句级触发器和行级触发器具体举例

3.触发器的语法

create [or replace] TRIGGER 触发器名 
触发时间 触发事件
on 表名
[for each row]
begin
 pl/sql语句
end

语法参数:

-- 禁用触发器
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;
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;

总结

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

您可能感兴趣的文章:
阅读全文