oracle触发器
触发器
说明
数据库触发器是一个与表相关联的、存储的PL/SQL程序。每当一个特定的数据操作语句(insert、update、delete)在指定的表上发出时,Oracle自动地执行触发器中定义的语句序列。
触发器的类型
语句级触发器
在指定的操作语句操作之前或之后执行一次,不管这条语句影响了多少行。
行级触发器(FOR EACH ROW)
触发语句作用的每一条记录都被触发。在行级触发器中使用old和new伪记录变量,识别值的状态。
触发器作用
1、数据确认。例如,增加工资不能低于原工资。
2、实施复杂的安全性检查。例如,周末禁止更改或新增数据。
3、做审计,跟踪表上所做的数据操作等。例如,操作记录。
4、数据的备份和同步。
创建触发器
- CREATE [or REPLACE] TRIGGER 触发器名
- (BEFORE|AFTER)
- (DELETE|INSERT|UPDATE[OF 列名])
- [FOR EACH ROW[WHEN(条件)]]
- PLSQL 块
创建一个非工作时间不能修改数据的触发器。
- --获取当前是几点
- to_char(sysdate,'hh24')
- --将字符转换为数字
- to_number(to_char(sysdate,'hh24'))
- --判断非工作时间
- not (to_number(to_char(sysdate,'hh24')) between 9 and 17)
- --阻止执行
- raise_application_error(-20000,'非工作时间禁止修改数据');
在触发器中阻止SQL继续执行的方法,抛出一个错误。错误号码应该在-20000到-20999之间,否则提示"错误号参数超出范围"。
- create or replace
- trigger mytrigger
- before insert
- on table_001
- declare
- begin
- if not (to_number(to_char(sysdate,'hh24')) between 9 and 17) then
- raise_application_error(-20000,'非工作时间禁止更新数据');
- end if;
- end;
创建一个增加工资不能低于原工资的触发器。
- declare
- begin
- if 新工资 < 原工资 then
- raise_application_error(-20001,'工资不能低于原工资');
- end if;
- end
触发语句与伪代记录变量的值。
触发语句 | :old | :new |
insert | 所有字段都是空(null) | 将要插入的数据 |
update | 更新以前该行的值 | 更新后的值 |
delete | 删除以前该行的值 | 所有字段都是空(null) |
- create or replace trigger checkSal
- before update
- on table_002
- for each row
- declare
- begin
- if :new.sal < :old.sal then
- raise_application_error(-20001,'涨工资不能低于原工资');
- end if;
- end;
- /
查看所有的触发器对象。
- select * from user_triggers;
删除触发器。
- drop trigger checkSal;
posted on 2018-01-12 22:43 yinshoucheng 阅读(633) 评论(0) 编辑 收藏 举报