触发器的分类:
语句级触发器:不管影响多少行,都只会执行一次
行级触发器:影响多少行,就触发多少次
一、语句触发器
1、当用户执行了 insert | update | delete
这些操作之后,可以触发一系列其他的动作 | 业务 trigerhandler
作用:
在动作执行之前或者之后,触发业务处理逻辑
插入数据,做一些校验
2、语法
create { or replace} trigger 触发器的名称
before | after
insert | update | delete
on 表名
declare
begin
end;
3、插入员工之后,输出一句话
-- 新员工入职之后,输出一句话:欢迎加入我们
create or replace trigger tri_test1
after
insert
on emp
declare
begin
dbms_output.put_line('欢迎加入我们');
end;
向emp表上插入
insert into emp(empno,ename) values(9527,'XAIOHONG');
插入成功
select * from emp;
插入成功的同时并且输出了一句话
--数据校验,星期五老板不在,不能办理新员工入职
--在插入数据之前
--判断当前日期是否是周五
--如果是周五,就不能插入信息
create or replace trigger tri_test2
before
insert
on emp
declare
-- 声明变量
vday varchar2(10);
begin
-- 查询当前日期
select trim(to_char(sysdate,'day')) into vday from dual;
-- 判断当前日期
if vday = 'friday' then
dbms_output.put_line('老板不再,不能办理入职');
--抛出系统异常
raise_application_error(-20001,'老板不再,不能办理入职');
end if;
end;
当插入信息的时候
insert into emp(empno,ename) values(9528,'XIAOHONG2');
二、行级触发器
:old 代表旧的记录,更新前的记录
:new 代表的是新的记录
create { or replace} trigger 触发器的名称
before | after
insert | update | delete
on 表名
[for each row]
declare
begin
end;
1、更新所有员工的工资
--更新所有的工资 输出一句话
create or replace trigger tri_test3
after
update
on emp
for each row
declare
begin
dbms_output.put_line('更新了数据');
end;
update emp set sal = sal + 10;
2、判断员工涨工资后工资一定要大于涨工资前的工资
--判断员工涨工资后工资一定要大于涨工资前的工资
create or replace trigger tri_updatesal
before
update
on emp
for each row
declare
begin
if :old.sal > :new.sal then
raise_application_error(-20002,'旧的工资不能大于新的工资');
end if;
end;
update emp set sal = 200 where empno = 7499;
增加数据
update emp set sal = sal + 10;
update emp set sal = sal - 10;
三、模拟mysql中ID自增长auto_increment
创建一张表
create table person(
pid number primary key,
pname varchar2(20)
);
这里不能向MySQL应用直接插入id为空的值,实现不了自增长
insert into person values(null,'张三');
解决如上问题
使用触发器来解决上述问题
(1)创建序列:create sequence seq_person_pid;
(2)触发器
create or replace trigger tri_add_person_pid;
before
insert
on person
for each row
declare
begin
dbms_output.put_line(:new.pname);
end;
插入数据
insert into person values(null,'张三');