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>第1步
创建一个日志表
<2>第2步
创建日志表主键的自增长序列
<3>第3步
创建触发器
<4>第4步
测试触发器
是数据库系统 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( 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;
相关文章推荐
- oracle时间操作
- ORACLE 查看锁
- Oracle数据库默认用户名和密码
- Oracle 11g Express Edition 安装及常见问题
- oracle 11G RAC scan监听器配置静态注册
- Oracle恢复误删的数据或表,解除锁定SQL或table
- ORACLE多表查询之子查询
- oracle 11G Rac service管理
- ORACLE-016:ora-01720 授权选项对于'xxxx'不存在
- ORACLE-016:ora-01720 授权选项对于'xxxx'不存在
- ORACLE-016:ora-01720 授权选项对于'xxxx'不存在
- ORACLE-016:ora-01720 授权选项对于'xxxx'不存在
- Oracle设置表中自增字段
- 用命令行(CMD)中启动和关闭ORACLE服务
- 图解如何配置Oracle本地Net服务名
- Oracle代码段的使用
- Java连接oracle
- oracle window function
- Windows 下Oracle database 9i 64bit 只有 Windows Itanium 64bit
- oracle数据库的删除