触发器篇开始了
一、介绍
触发器,对于学过数电的同学应该不陌生,它是具有记忆功能的基本单元电路,在输入信号消失后能保存上一输入信号。没学过的来看数据库中的定义
触发器是一个特殊的存储过程,当某一事务发生时自动激活相应触发子,执行该过程,这是一种隐式执行
二、语法结构
由于和存储过程类似,不再举例学习
create or replace trigger tri_name
before/after
tri_event1[or tri_event2] on table_name
for each row [when 限制条件]
pl/sql block;
- before/after:触发时间,选择在操作事件之前还是之后
- tri_event:操作事件,如insert、delete、update
- table_name:基本表名称
- for each row:语句级触发,当要删除更新n行时,触发n次,没有则只触发一次
- [限制条件]:表中要操作的一行需要符合的条件
- pl/sql block:要实现的功能(具体操作)
三、举例
”实践是检验真理的唯一标准“
任务一:制作备份表,实现当表格中的数据被删除,则将该数据存入备份表中
1、建表
--原表
create table employee(
eid varchar2(5) not null,
ename varchar2(4) not null,
age number(3) not null,
sex char(6) not null
);
--备份表
create table emp as
select * from employee;
插入数据
employee表
emp表
2、创建触发器
--after
create or replace trigger backup_emp1
after delete on employee
for each row
begin
insert into emp values(:old.eid,:old.ename,:old.age,:old.sex);
end;
--before
create or replace trigger backup_emp2
before delete on employee
for each row
begin
insert into emp values(:old.eid,:old.ename,:old.age,:old.sex);
end;
拓展知识:
- ':old'、':new':引用更新前、后的行
3、测试用例
--测试backup_emp1
delete from employee where eid='e101';
employee表
emp表
--测试backup_emp2
delete from employee where eid='e102';
employee表
emp表
任务二:实现日志记录,记录某用户对某一表操作类型、操作次数
1、建表
--原表
create table employee(
eid varchar2(5) not null,
ename varchar2(4) not null,
age number(3) not null,
sex char(6) not null
);
--日志表
create table logs(
user_name varchar2(50) not null,
table_name varchar2(20) not null,
in_times number(3) default 0,
up_times number(3) default 0,
de_times number(3) default 0);
插入数据
employee表
logs表
2、创建触发器
create or replace trigger log_in
after insert or delete or update on employee
for each row
declare
u_c number;
begin
--当用户未在日志表中,创建用户初始操作数据
select count(*) into u_c from logs
where user_name=user;
if u_c=0 then
insert into logs values(user,'employee',0,0,0);
end if;
--为用户更新操作数据
if inserting then update logs set in_times=in_times+1
where user_name=user and table_name='employee';
elsif updating then update logs set up_times=up_times+1
where user_name=user and table_name='employee';
else update logs set de_times=de_times+1
where user_name=user and table_name='employee';
end if;
end;
注意这其中对操作的称呼有变化:insert[inserting]、update[updating]、delete[deleting]
- 变量定义
- 判断某个内容是否在表中,可以用count()
- if条件判断不能加select作条件
3、测试用例
--1
insert into employee values('e101','zdn',20,'female');
--2
update employee set age=20 where age<20;
--3
delete from employee where eid='e103';
(1)
(2)
employee表 logs表
(3)
employee表 logs表
4、附加操作
--禁用
alter trigger log_in disable;
--启用
alter trigger log_in enable;
大家可以在学会语法的基础上搜一些小课题来完成,更加挑战项目思维。
学废了吗?
07结