oracle-数据库07

触发器篇开始了

一、介绍

触发器,对于学过数电的同学应该不陌生,它是具有记忆功能的基本单元电路,在输入信号消失后能保存上一输入信号。没学过的来看数据库中的定义

触发器是一个特殊的存储过程,当某一事务发生时自动激活相应触发子,执行该过程,这是一种隐式执行

二、语法结构

由于和存储过程类似,不再举例学习

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结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值