您的位置:首页 > 数据库 > Oracle

Oracle触发器

2015-08-25 10:11 627 查看
触发器(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;


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: