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

原创粉丝点击