触发器是一个特殊的存储过程;
存储过程和存储函数是一个完成特定功能的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;