触发器(trigger)
是数据库系统 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。
触发器是在事件发生时隐式地自动运行的PL/SQL程序块,不能接收参数,不能被调用。与存储过程类似,由PL/SQL编写并存储在数据库中,但是触发器只能由数据库特定的事件来触发。
主要包括如下几种类型事件:
<1>用户在指定的表或视图中做DML操作
INSERT
UPDATE
DELETE
<2> 用户做DDL操作
CREATE
ALTER
DROP
<3>数据库事件
LOGON/LOGOFF
STARTUP/SHUTDOWN
ERRORS特定的错误消息等
触发器类型:
数据操作语言(DML)触发器;
数据定义语言(DDL)触发器;
用户和系统事件触发器.
首先创建如下的表结构:
1.建原始表并插入数据
--创建原始表
create table categoryinfo
(
cid varchar2(10) primary key,
cname varchar2(20)
);
commit;
create table productinfo
(
pid varchar2(10) primary key,
pname varchar2(20),
price number(8,2),
quanty number(10),
category varchar2(10),
desperation varchar2(1000),
origin varchar2(20)
);
commit;
--插入原始数据
insert into categoryinfo(cid,cname) values('01','食品');
insert into categoryinfo(cid,cname) values('02','家电');
insert into categoryinfo(cid,cname) values('03','洗化');
insert into categoryinfo(cid,cname) values('04','电子产品');
insert into categoryinfo(cid,cname) values('05','办公用品');
insert into categoryinfo(cid,cname) values('06','玩具');
insert into categoryinfo(cid,cname) values('07','文具');
commit;
insert into productinfo(pid,pname,price,quanty,category,desperation,origin) values('001','纸巾',20,10000,'03','原生木浆','河北');
insert into productinfo(pid,pname,price,quanty,category,desperation,origin) values('002','笔记本电脑',5000,300,'04','坚如磐石,中国品质','中国');
insert into productinfo(pid,pname,price,quanty,category,desperation,origin) values('003','冰箱',7000,900,'02','每晚只用一度电','杭州');
insert into productinfo(pid,pname,price,quanty,category,desperation,origin) values('004','U盘',50,500,'04','随插随拔','中国');
insert into productinfo(pid,pname,price,quanty,category,desperation,origin) values('005','空调',4000,100,'02','让你四季如春','杭州');
insert into productinfo(pid,pname,price,quanty,category,desperation,origin) values('006','U盘',10,500,'04','随插随拔','中国');
insert into productinfo(pid,pname,price,quanty,category,desperation,origin) values('007','U盘',17,500,'04','随插随拔','中国');
commit;
然后:
<1>第1步
创建一个日志表
create table log_tb
(
log_id varchar2(10) primary key, --记录编号
oper_tb_name varchar2(30), --被操作的表名
oper_tb_pk varchar2(10), --被操作的表主键
oper_type varchar2(10), --操作的类型
oper_date date --操作的时间
);
commit;
<2>第2步
创建日志表主键的自增长序列
create sequence log_tb_id
minvalue 100000
maxvalue 999999
start with 100000
increment by 1;
<3>第3步
创建触发器
create or replace trigger trigger_insert_prod
before insert on productinfo
for each row
begin
if inserting then
insert into log_tb values
(log_tb_id.nextval,'productinfo','insert',:new.pid,sysdate);
dbms_output.put_line('更新提示--插入如下日志记录:'||
'被操作的表:'||
'productinfo'||
'执行的操作:'||
'insert'||
'插入的记录主键:'||
:new.pid||
'操作的时间:'||sysdate);
end if;
end trigger_insert_prod;
<4>第4步
测试触发器
select * from productinfo;
select * from log_tb;
--打开屏幕输出
set serverout on;
/
--插入一条数据
insert into productinfo(pid,pname,price,quanty,category,desperation,origin) values('008','变形金刚',200,100,'06','大黄蜂','USA');
select * from productinfo;
select * from log_tb;