- 什么是触发器?
触发器是一个特殊的存储过程。
数据库触发器是一个与表想关联的,存储的PL/SQL程序
每当一个特定的数据操作语句(insert,Update,delete)在指定的表发出时,Oracle自动执行触发器中定义的语句序列
- 触发器的应用场景。
- 复杂的安全性检查(代码请看式例一)
- 在特定的时间段不让操作数据,比如在周末or非工作时间,不让操作数据
- 数据的确认(代表请看式例二)
- 比如涨工资的时候,涨的工资肯定要比原工资要高,才叫涨工资。这时候就需要数据的确认。
- 数据库的审计
- 跟踪表上所在的数据操作。什么时间,什么人,操作了什么数据,操作的数据是什么,这就是数据库的审计。
- 数据库审计在oracle数据库中已经单独实现了,并且非常的强大。
- 数据库审计在Oracle中有五种,触发器只是其中一种。
- 完成数据的备份和同步
- 把主表里的数据备份到从表里,如果主表数据库崩溃就可以用从表数据库。
- 触发器的类型
- 语句级触发器
- 在指定的操作语句操作之前或操作之后执行一次,不管这条语句影响了多少行。
- 行级触发器
- 触发语句作用的每一条语句都被触发。在行级触发器中使用:old和:new伪记录变量,识别值的状态。
- :old 和 :new 代表的是同一行里的数据
- :old 代表是操作之前的数据
- :new 代表的是操作之后的数据
- 语句级触发器
- 触发器的语法(demo)
插入一条新员工之后打印一条语句
create trigger/*触发器关键字*/ saynewemp /*触发器名称*/
after /*插入成功之后执行*/ insert /*添加数据的时候执行*/ on emp /*表名*/
declare
begin
dbms_output.put_line('成功插入新员工'); /*要执行的语句序列*/
end;
- --实施复杂的安全性检查(式例一)
--禁止在非工作时间插入数据(这个触发器代表的是“语句型触发器”。影响的是整个表,不关心受影响的行数)
/*
1.周末 to_char(sysdate,'day') in ('星期六','星期日')
2.上班前 下班后 to_number(to_char(sysdate,'hh24')) not between 9 and 18
- before 操作之前执行 after 操作之后执行
- raise_application_error(-20001 ~ -29999,'提示字符串'); 该函数代表自定义异常信息
*/
create or replace trigger securityemp
before insert on aaaaaa
declare
begin
if to_char(sysdate, 'day') in ('星期六', '星期日') or
to_number(to_char(sysdate, 'hh24')) not between 9 and 18 then
raise_application_error(-20001, '禁止在非工作时间插入数据');
end if;
end;
- /* (式例二)
数据的确认(这是一个行级触发器)
涨后的薪水不能少于涨前的薪水
:old 和 :new 代表的是同一行里的数据
:old 代表是操作之前的数据
:new 代表的是操作之后的数据
for each row 加上这条语句就代表是行级触发器
*/
create or replace trigger namename
before update on aaaaaa
for each row
declare
begin
if :old.role_name > :new.role_name then
raise_application_error(-20003, '涨后的薪水不能少于涨前的薪水');
end if;
end;