oracle触发器
来源:互联网 发布:克拉科夫理工大学 知乎 编辑:程序博客网 时间:2024/05/16 14:09
1、触发器为自动调用,当定义好触发器后,用户对表再进行操作,就会自动调用触发器。
2、创建触发器格式
CREATE [OR REPLACE] TRIGGER 触发器名 {BEFORE|AFTER|INSTEAD OF} 触发事件1 [OR 触发事件2...] ON 表名 [FOR EACH ROW] 行级 [WHEN 触发条件] DECLARE 声明部分 BEGIN 主体部分 END 触发器名;
3、定义触发器需要注意
一个表最多只能有三类触发器,insert,update,delete
每个触发器只能用于一个表
dml触发器不能对视图、临时表创建触发器
truncate table能删除表,但不能触发触发器 dml
不能将触发器用于系统表
不能在触发器里使用 DTL commit rollback;
4、触发器案例
--创建简单触发器(行级别触发器)
SQL> --创建触发器SQL> create or replace trigger stu_triger 2 --可以写update、insert、delete 3 after update on zr_stu 4 --这句表示行级触发器,如果没有那么操作多次表,只执行一次触发器 5 for each row 6 declare 7 name varchar2(30); 8 begin 9 --:new.stusex 打印新数据,:old.stusex 打印以前数据 10 dbms_output.put_line('new:'||:new.stusex||'old:'||:old.stusex); 11 --结束的时候,要把触发器的名写在end后 12 end stu_triger; 13 / Trigger created
--使用触发器
SQL> update zr_stu set stusex='男'; new:男old:女new:男old:女new:男old:女new:男old:女new:男old:女 5 rows updated
--创建简单触发器(表级触发器,语句级)
SQL> --创建触发器SQL> create or replace trigger stu_triger2 2 --可以写update、insert、delete 3 after update on zr_stu 4 declare 5 name varchar2(30); 6 begin 7 dbms_output.put_line('跟新操作'); 8 --结束的时候,要把触发器的名写在end后 9 end stu_triger2; 10 / Trigger created
--使用语句级触发器
SQL> update zr_stu set stuname = '女' where stuid = 5; new:男old:男跟新操作 1 row updated
--注明zr_stu表结构和数据
SQL> desc zr_stu;Name Type Nullable Default Comments ------- ------------ -------- ------- -------- STUID NUMBER(10) STUNAME VARCHAR2(20) STUSEX VARCHAR2(2) Y '男' SQL> select * from zr_stu; STUID STUNAME STUSEX----------- -------------------- ------ 1 付政委 男 2 江风 男 3 郝忠军 男 4 冯奇缘 男 5 女 男 SQL> rollback;
说明
行级触发器,可以监听多条数据的控制表级触发器,可以监听一条语句的控制一个表可以有多个触发器但是一个触发器不能给多个表用
案例、用触发器给表加日志
--日志表
SQL> create table loginfo( 2 logid number(10) primary key, 3 logcount varchar2(20)); Table created
--建存款表
SQL> create table acount( 2 accountid number(10) primary key, 3 accountname varchar2(20), 4 accountnum number(6,2)); Table created Executed in 0.563 seconds
--创建触发器
SQL> create or replace trigger logtriger 2 after update on account 3 for each row 4 when (old.accountname in('张三','王五')) 5 begin 6 if :new.accountnum > :old.accountnum then 7 insert into loginfo values(sdii.nextval,'存款'||(:new.accountnum - :old.accountnum)); 8 else 9 insert into loginfo values(sdii.nextval,'取款'||(:old.accountnum - :new.accountnum)); 10 end if; 11 end logtrigger; 12 / Trigger created Executed in 0.578 seconds
--给表加一条记录
SQL> insert into account values(sdii.nextval,'张三',2000); 1 row inserted Executed in 0 seconds SQL> select * from account; ACCOUNTID ACCOUNTNAME ACCOUNTNUM----------- -------------------- ---------- 24 张三 2000.00 Executed in 0.031 seconds
--修改记录(存款)
SQL> update account set accountnum = 3000 where accountid = 24; 1 row updated Executed in 0.015 seconds
--查询日志表看内容
SQL> select * from loginfo; LOGID LOGCOUNT----------- -------------------- 25 存款1000 Executed in 0.031 seconds
- oracle 触发器
- Oracle触发器
- Oracle触发器
- oracle触发器
- ORACLE触发器
- oracle触发器
- Oracle 触发器
- oracle触发器
- Oracle触发器
- Oracle 触发器
- Oracle 触发器
- Oracle 触发器
- oracle触发器
- oracle 触发器
- Oracle触发器
- oracle触发器
- ORACLE触发器
- ORACLE 触发器
- Wince下usb驱动详细总结(史无前例的详细)
- 直方图均衡化
- 20个常用的Java程序块
- Lease 机制在分布式系统中的应用
- svn 修改文件名
- oracle触发器
- 敏捷开发
- create magento custom api
- VirtualBox 提示虚拟硬盘空间不足( Host system reported disk full.)
- 详解Qt样式/颜色机制:调色板(QPalette)与样式表(Style Sheets)
- Shell编程积累
- 写code的规范
- 在C#中用JQuery做弹窗效果!
- XML读写操作之DOM4J