触发器
触发器是一个与表关联的pl/sql程序,insert update delete在指定的表上发出时,Oracle会自动执行触发器的相关逻辑。
1、安全性检查
2、数据确认
3、审计功能
4、数据备份或同步
create trigger tri_name
after|before insert|update|delete[of 字段名]
on table_name
[for each row]--行级
begin
....
end;
/
第一个触发器(新增一个数据,打印一句“添加了一个员工”)
create trigger insert_briup_emp
after insert
on briup_emp
begin
dbms_output.put_line('添加了一个员工');
end;
/
实现日志记录
create table briup_emp_tag
(tag varchar2(10),
time date);
create trigger briup_emp_log_trigger
after insert or update or delete
on briup_emp
declare
ptag briup_emp_tag.tag%type;
begin
if inserting then ptag:='添加';
elsif updating then ptag:='修改';
elsif deleting then ptag:='删除';
end if;
insert into briup_emp_tag values(ptag,sysdate);
end;
/
(安全性检查)在非工作时间禁止向员工表中新增员工。
星期六日和工作日6:00 pm——8:00 am禁止
create trigger check_data
before insert
on briup_emp
begin
if to_char(sysdate,'day') in ('星期六','星期日');
or
to_number(to_char(sysdate,'hh24'))not between 8 and 12 then
raise_application_error('-21112','禁止在非工作时间内添加数据');
end if;
end;
/
数据确认
create trigger sal_trigger
before update
on briup_emp
for each row
begin
if :old.sal >:new.sal then
raise_application_error(-20002,'涨之前的工资是'||:old.sal||'涨之后的工资是'||:new.sal);
end if;
end;
/
行级触发器:一条语句都可以触发
(审计功能)涨完工资以后工资超过6000,就提取他的信息。
create table briup_emp_info(
info varchar2(1000)
);
create trigger info_trigger
after update
on briup_emp
for each row
begin
if:new.sal>6000 then
insert into briup_emp_info values(:new.ename||' '||:old.sal||' '||:new.sal);
end if;
end;
/
(数据备份或者同步)
create table briup_emp_bak as select * from briup_emp;
create trigger bak_trigger
after update
on briup_emp
for each row
begin
update briup_emp_bak set sal=:new.sal where empno=:new.empno;
end;
/
网友评论