触发器:自动执行,可以实现表的约束。

1.行级触发器:  

  1. CREATE OR REPLACE TRIGGER del_deptid
  2. AFTER DELETE ON deptment --触发器条件 DELETE动作
  3. FOR EACH ROW --循环每一行都改
  4. BEGIN
  5. DELETE FROM emp WHERE id=:old.id; --触发后动作
  6. END del_deptid; --END;都行
  7. /
  1. DELETE FROM deptment WHERE id=''; --触发触发器
  1. CREATE OR REPLACE TRIGGER insert_dept
  2. AFTER INSERT ON deptment --触发器条件 INSERT动作
  3. FOR EACH ROW --循环每一行都改
  4. BEGIN
  5. INSERT INTO emp(eid ,ename,id) VALUES('','qwer',:new.id); --触发后动作
  6. END;
  7. /
  old new
insert n y
delete y n
update y y

n为不涉及的

只有在创建触发器的时候会触及oracle的old和new逻辑表,old和new是oracle在内存中建立的表,表的字段结构和触发器所涉及的表的字段结构一致,对表操作时,先将要修改的内容保存在old和new中,commit后写到磁盘中,如删除表中的一条的数据,先将内存中该表的该条数据移动到old表中,插入是将要插入的数据先插入到new中,之后再插入到内存表中,更新是将where后的信息存入old,将set红的数据存入new中,其他不变字段就一样。

利用old和new表做级联更新:

  1. CREATE OR REPLACE TRIGGER update_dept
  2. AFTER UPDATE ON deptment
  3. FOR EACH ROW
  4. BEGIN
  5. UPDATE emp SET id=:new.id WHERE id=:old.id;
  6. END;
  7. / --不可以在语句块中写commit rollback
  1. UPDATE deptment SET id='yy' WHERE id='';
  1. CREATE OR REPLACE TRIGGER book_delete
  2. AFTER DELETE ON books
  3. FOR EACH ROW
  4. BEGIN
  5. IF :old.books_id='' THEN --通过触发器实现控制
  6. RAISE_APPLICATION_ERROR(-20000,'不允许删除!'); ---2000为错误代码
  7. END IF;
  8. END;
  9. /

2.语句级触发器:

  1. CREATE OR REPLACE TRIGGER dml_aa
  2. AFTER INSERT OR DELETE OR UPDATE --可以是多个动作触发
  3. BEGIN --没有for each row 没有数据完整性约束
  4. IF INSERTING THEN
  5. INSERT INTO mylog VALUES(user,sysdate,'I');
  6. ELSIF DELETING THEN
  7. INSERT INTO mylog VALUES(user,sysdate,'D');
  8. ELSE
  9. INSERT INTO mylog VALUES(user,sysdate,'U');
  10. END IF;
  11. END;
  12. /

3.利用触发器实现表中整型字段的自增:

  1. CREATE OR REPLACE TRIGGER set_no
  2. BEFORE INSERT ON auto --前触发器,插入之前做一个预处理
  3. FOR EACH ROW
  4. DECLARE
  5. sn number(5); --定义变量
  6. BEGIN
  7. SELECT myseq.nextval INTO sn FROM dual;--取出myseq序列的值,放入变量中
  8. :NEW.a:=sn; --插入前,将sn的值赋给表中的a字段,NEW为触发器在内存中自动生成的和要处理的表字段结构一致的表,即auto表中的a字段,如果用向a字段。
  9. END;
  10. /

4.替换触发器:

有的视图是由两个表组成的,当视图是由两个或两个以上组成的是不允许同时更新的,而替换触发器可以解决这种视图的多表更新的,替换触发器在Oracle中只能建在视图上。

视图建立在员工表和部门表上,v_emp_dept;

当向视图中插入数据时会提示,每次只能更改一个表中的信息,用替换触发器解决此问题的方法。

  1. CREATE OR REPLACE TRIGGER tr_v_e_d
  2. INSTEAD OF INSERT ON v_emp_dept --替换向v_emp_dept 视图中插入数据的方法,分别向两个表中插入数据实现
  3. FOR EACH ROW --替换触发器是特别的行触发器
  4. BEGIN
  5. INSERT INTO deptment VALUES(:new.id,:new.name);
  6. INSERT INTO emp(eid,ename,sex,id) VALUES(:new.eid,:new.ename,:new.sex,:new.id);
  7. END;
  8. /

事物

修改表的时候如果不 commit 是不会修改的,虽然用查询语句查询会出现该条记录已被修改,但只是在内存中修改,用 rollback命令即可还原,只要没commit就没有修改该表。commit 是将内存中的数据写到磁盘上,rollback命令可还原上一个动作的的修改,一旦commit之后,就不可以rollback回来了,rollback之后也不可以commit了。

SELECT * FROM  dept FOR UPDATE;
这样在其他用户下就不可以修改该表,直到你修改之后,commit,别人才可以改,像是买票那个锁。

Oracle 触发器,事物的更多相关文章

  1. ORACLE 自治事物

    ORACLE 自治事物 一.问题 (1)现象   一个表A,存在一个触发器,该触发器用来统计表A的数量,并将结果更新到B表.此时,java代码里面调用insert into select 语句,会发生 ...

  2. 2014/11/06 Oracle触发器初步 2014-11-06 09:03 49人阅读 评论(0) 收藏

    触发器我就不多解释了,保证数据的完整性的神器,嗯..也是减少程序员工作托管给数据库操作的好帮手.就不讲一些大道理了.通俗点,我们对数据库的操作,无非就是增 删 改 查. 触发器就是在删,改,增的时候( ...

  3. oracle触发器加条件判断

    oracle触发器加条件判断,如果某个字段,isnode=0,那么不执行下面的方法,数据如下: create or replace trigger tr_basestation_insert_emp ...

  4. [转]连续创建多个Oracle触发器失败,单个创建才成功的解决方法

    连续创建多个Oracle触发器失败,单个创建才成功的解决方法   1.当我连续执行创建多个触发器时,总是报编译通过,但存在警告或错误.如下:   create or replace trigger t ...

  5. Oracle 触发器在日志管理开发中的应用

    摘要: 本文讨论了利用数据库中的触发器对日志管理进行设计与实现的方法, 是对原来在客户端软件中编写日志管理方法的一种改进, 并给出了 Oracle9i 中的实例演示.关键词: Oracle; 触发器; ...

  6. oracle触发器应用

    首先给大家推荐两篇我看后的博文,我已经内容转载过来: 1.对触发器的讲解 本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建 ...

  7. Mybatis 插入操作时获取主键 (Oracle 触发器与SEQ)

    1.通过Oracle序列 -- Create sequence create sequence SEQ_DW_EWSYSTEM minvalue 1 maxvalue 9999999999999999 ...

  8. SQL server与Oracle触发器的创建与使用

    SQL Server 1创建触发器 GO BEGIN IF (object_id('WMY', 'tr') is not null) DROP trigger WMY END; GO CREATE T ...

  9. oracle触发器中增删改查本表

    oracle触发器中增删改查本表 (1)只有before insert触发器中才可以查询或更新本表 create or replace trigger tri_test_ins before inse ...

  10. Oracle触发器用法实例详解

    转自:https://www.jb51.net/article/80804.htm. 本文实例讲述了Oracle触发器用法.分享给大家供大家参考,具体如下: 一.触发器简介 触发器的定义就是说某个条件 ...

随机推荐

  1. OpenStack/Gnocchi简介——时间序列数据聚合操作提前计算并存储起来,先算后取的理念

    先看下 http://www.cnblogs.com/bonelee/p/6236962.html 这里对于环形数据库的介绍,便于理解归档这个操作! 转自:http://blog.sina.com.c ...

  2. 什么是 Unix 以及它为什么这么重要?

    大多数操作系统可以被划分到两个不同的家族.除了微软的基于Windows NT的操作系统外,几乎所有其他的都可以追溯到Unix. Linux,Mac OS X,Android,iOS,Chrome OS ...

  3. 使用SMSManager短信管理器发送短信

    import android.os.Bundle;import android.app.Activity;import android.app.PendingIntent;import android ...

  4. bzoj 2428: [HAOI2006]均分数据

    #include<cstdio> #include<iostream> #include<cstdlib> #include<ctime> #inclu ...

  5. C++定义构造函数必须使用初始化列表的场合

    明其理,而知其然也. 先给理论.1. 初始化 != 赋值. a.初始化代表为变量分配内存. 变量在其定义处被编译器初始化(编译时). 在函数中, 函数参数初始化发生在函数调用时(运行时). b.赋值代 ...

  6. windows-docker开发我常用命令 docker-machine ssh default

    docker-machine ssh default  docker logs test sudo systemctl start docker       docker tag IMAGEID ne ...

  7. How to setup SVN?

    2014-01-08 11:43:50 如何简单设置SVN(前提是SVN已经安装) 1. 创建一个目录: mkdir -p ~/svn/2.1.J.1.1 2. 进入新创建的目录: cd svn/2. ...

  8. NOIP2013 提高组day2 3 华容道 BFS

    描述 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面,华容道是否根本就无法完成,如果能完成,最少需要多少时间. 小 B 玩的华容道与经典的 ...

  9. Rhel6-keepalived+lvs配置文档

    系统环境: rhel6 x86_64 iptables and selinux disabled 主机: 192.168.122.119 server19.example.com 192.168.12 ...

  10. C# SVN检出的代码,F12显示从元数据

    解决办法: 删除项目中的引用(同时也要删除bin文件夹中的dll文件,否则不能重新添加),并重新添加本地引用即可. 原因: 项目中的dll文件不是本机编译出来的,所以找不到元数据.如果当前关联的项目里 ...