打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
oracle触发器

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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
SQL SERVER2005触发器
!!(转)SQL Server使用总结
基本SQL语句(一篇就够了)
Sql server 2005学习笔记之约束
SQL Server笔试题 解答
请教:触发器中select语句里面的表名称不能使用变量吗?
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服