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
联系客服