Oracle之触发器

触发器是一个特殊的存储过程;
存储过程和存储函数是一个完成特定功能的PL/SQL程序;
触发器的应用场景:
1,复杂的安全检查,
2,数据确认
3,实现审计功能
4,完成数据的备份和同步
触发器的类型分为语言级和行级
创建触发器的代码结构

create triggger saynewemp
after insert
on emp
declare
begin
     dbms_output.put_line('成功插入新员工');
end;  #当执行插入语句时,就打印'成功插入新员工';

CREATE [OR REPLACE] TRIGGER 
{BEFORE | AFTER}
{DELETE|INSERT|UPDATE|[OF 列名]}
ON 表名
[FOR EACH ROW [WHERE(条件)]]
PLSQL 块;

FOR EACH ROW 就是行级触发器
如:

insert into emp(empno,ename,sal,deptno) values(1001,'Tom',3003,10);

当上述语句执行成功后,就打印'成功插入新员工';
语句级触发器对应的是表,
行级触发器对应的是行
应用场景:
1,复杂的安全检查 如:禁止非工作时间插入新员工

create or replace trigger security_emp
before insert
on emp
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;

2,数据确认,如涨工资后不能小于以前的工资

create or replace trigger checksalary
before update 
on emp
for each row
begin 
  if :new.sal < :old.sal then
    raise_application_error(-20002,'涨工资后的工资不能小于涨前的工资' ||:new.sal||:old.sal);
  else if;
end;

3,审计功能,触发器的审计是基于值的审计,如当涨工资后工资大于6000时审计
首先创建审计表,用于保存审计信息

create table audit_info(information varchar2(200));
create or replace trigger do_audit_emp_salary
after update
on emp 
for each row 
begin 
  if :new.sal > 6000 then
    insert into audit_info values(:new.empno||'  '||:new.ename||'  '||:new.sal);
  end if;
end;

4,数据的备份和同步,(注:触发器是同步备份,快照是异步备份)

create table emp_bake as select * from emp;
create or replace trigger sync_salary
after update
on emp
for each row
begin 
  update emp_bake set sal= :new.sal where empno=:new.empno;
end;

参考:https://www.imooc.com/learn/414

你可能感兴趣的:(Oracle之触发器)