Oracle 触发器,事物
触发器:自动执行,可以实现表的约束。
1.行级触发器:
CREATE OR REPLACE TRIGGER del_deptid
AFTER DELETE ON deptment --触发器条件 DELETE动作
FOR EACH ROW --循环每一行都改
BEGIN
DELETE FROM emp WHERE id=:old.id; --触发后动作
END del_deptid; --END;都行
/
DELETE FROM deptment WHERE id=''; --触发触发器
CREATE OR REPLACE TRIGGER insert_dept
AFTER INSERT ON deptment --触发器条件 INSERT动作
FOR EACH ROW --循环每一行都改
BEGIN
INSERT INTO emp(eid ,ename,id) VALUES('','qwer',:new.id); --触发后动作
END;
/
| 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表做级联更新:
CREATE OR REPLACE TRIGGER update_dept
AFTER UPDATE ON deptment
FOR EACH ROW
BEGIN
UPDATE emp SET id=:new.id WHERE id=:old.id;
END;
/ --不可以在语句块中写commit 和 rollback
UPDATE deptment SET id='yy' WHERE id='';
CREATE OR REPLACE TRIGGER book_delete
AFTER DELETE ON books
FOR EACH ROW
BEGIN
IF :old.books_id='' THEN --通过触发器实现控制
RAISE_APPLICATION_ERROR(-20000,'不允许删除!'); ---2000为错误代码
END IF;
END;
/
2.语句级触发器:
CREATE OR REPLACE TRIGGER dml_aa
AFTER INSERT OR DELETE OR UPDATE --可以是多个动作触发
BEGIN --没有for each row 没有数据完整性约束
IF INSERTING THEN
INSERT INTO mylog VALUES(user,sysdate,'I');
ELSIF DELETING THEN
INSERT INTO mylog VALUES(user,sysdate,'D');
ELSE
INSERT INTO mylog VALUES(user,sysdate,'U');
END IF;
END;
/
3.利用触发器实现表中整型字段的自增:
CREATE OR REPLACE TRIGGER set_no
BEFORE INSERT ON auto --前触发器,插入之前做一个预处理
FOR EACH ROW
DECLARE
sn number(5); --定义变量
BEGIN
SELECT myseq.nextval INTO sn FROM dual;--取出myseq序列的值,放入变量中
:NEW.a:=sn; --插入前,将sn的值赋给表中的a字段,NEW为触发器在内存中自动生成的和要处理的表字段结构一致的表,即auto表中的a字段,如果用向a字段。
END;
/
4.替换触发器:
有的视图是由两个表组成的,当视图是由两个或两个以上组成的是不允许同时更新的,而替换触发器可以解决这种视图的多表更新的,替换触发器在Oracle中只能建在视图上。
视图建立在员工表和部门表上,v_emp_dept;
当向视图中插入数据时会提示,每次只能更改一个表中的信息,用替换触发器解决此问题的方法。
CREATE OR REPLACE TRIGGER tr_v_e_d
INSTEAD OF INSERT ON v_emp_dept --替换向v_emp_dept 视图中插入数据的方法,分别向两个表中插入数据实现
FOR EACH ROW --替换触发器是特别的行触发器
BEGIN
INSERT INTO deptment VALUES(:new.id,:new.name);
INSERT INTO emp(eid,ename,sex,id) VALUES(:new.eid,:new.ename,:new.sex,:new.id);
END;
/
事物
修改表的时候如果不 commit 是不会修改的,虽然用查询语句查询会出现该条记录已被修改,但只是在内存中修改,用 rollback命令即可还原,只要没commit就没有修改该表。commit 是将内存中的数据写到磁盘上,rollback命令可还原上一个动作的的修改,一旦commit之后,就不可以rollback回来了,rollback之后也不可以commit了。
Oracle 触发器,事物的更多相关文章
- ORACLE 自治事物
ORACLE 自治事物 一.问题 (1)现象 一个表A,存在一个触发器,该触发器用来统计表A的数量,并将结果更新到B表.此时,java代码里面调用insert into select 语句,会发生 ...
- 2014/11/06 Oracle触发器初步 2014-11-06 09:03 49人阅读 评论(0) 收藏
触发器我就不多解释了,保证数据的完整性的神器,嗯..也是减少程序员工作托管给数据库操作的好帮手.就不讲一些大道理了.通俗点,我们对数据库的操作,无非就是增 删 改 查. 触发器就是在删,改,增的时候( ...
- oracle触发器加条件判断
oracle触发器加条件判断,如果某个字段,isnode=0,那么不执行下面的方法,数据如下: create or replace trigger tr_basestation_insert_emp ...
- [转]连续创建多个Oracle触发器失败,单个创建才成功的解决方法
连续创建多个Oracle触发器失败,单个创建才成功的解决方法 1.当我连续执行创建多个触发器时,总是报编译通过,但存在警告或错误.如下: create or replace trigger t ...
- Oracle 触发器在日志管理开发中的应用
摘要: 本文讨论了利用数据库中的触发器对日志管理进行设计与实现的方法, 是对原来在客户端软件中编写日志管理方法的一种改进, 并给出了 Oracle9i 中的实例演示.关键词: Oracle; 触发器; ...
- oracle触发器应用
首先给大家推荐两篇我看后的博文,我已经内容转载过来: 1.对触发器的讲解 本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建 ...
- Mybatis 插入操作时获取主键 (Oracle 触发器与SEQ)
1.通过Oracle序列 -- Create sequence create sequence SEQ_DW_EWSYSTEM minvalue 1 maxvalue 9999999999999999 ...
- SQL server与Oracle触发器的创建与使用
SQL Server 1创建触发器 GO BEGIN IF (object_id('WMY', 'tr') is not null) DROP trigger WMY END; GO CREATE T ...
- oracle触发器中增删改查本表
oracle触发器中增删改查本表 (1)只有before insert触发器中才可以查询或更新本表 create or replace trigger tri_test_ins before inse ...
- Oracle触发器用法实例详解
转自:https://www.jb51.net/article/80804.htm. 本文实例讲述了Oracle触发器用法.分享给大家供大家参考,具体如下: 一.触发器简介 触发器的定义就是说某个条件 ...
随机推荐
- apache 日志为每个域名独立配置单独的日志文件
<VirtualHost *:80>DocumentRoot "E:\luyou\viplijiang"ServerName vip.li.comTransferLog ...
- [示例]NSDictionary编程题-字典的排序应用(iOS7班)
代码: #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepo ...
- 在oracle中使用Trigger
1.初始目标 在对表h1插入一条数据时,同时插入一条重复的数据(只有主键不同) 2.在PL/SQL里New一个Trigger或者手动敲入代码 先说明一下,表h1包括4列ID.C1.C2.C3 crea ...
- C++封装库
1.新建项目 -> Win32项目 选择DLL , 勾选 空项目 , 点击完成. 2.本例程,使用一个CPP文件 , 及一个头文件. 其中头文件包含函数声明,CPP文件实现函数声明. 3. ...
- 【同行说技术】Python程序员小白变大神必读资料汇总( 三)
在文章<Python开发.调试.爬虫类工具大全>里面向大家总结了各种实用工具和爬虫技术,今天小编收集了5篇带有实例干货的资料,赶紧来看看吧!另外,喜欢写博客的博主可以申请加工程师博主交流群 ...
- bzoj 2820 YY的GCD 莫比乌斯反演
题目大意: 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对 这里就抄一下别人的推断过程了 后面这个g(x) 算的方法就是在线性 ...
- HDU 1358 简单kmp
题目大意: 找到所有的可组成连续字符串相连的位置,和循环字符串的个数 #include <cstdio> #include <cstring> #include <alg ...
- 戴文的Linux内核专题:03驱动程序
转自Linux中国 驱动程序是使内核能够沟通和操作硬件或协议(规则和标准)的小程序.没有驱动程序,内核不知道如何与硬件沟通或者处理协议(内核实际上先发送指令给BIOS,然后BIOS传给硬件). Lin ...
- 编写一个小Servlet程序
1.编写一个java类,此类继承HttpServlet 创建完工程(见上一篇随笔:使用eclipse创建在myeclipse中运行的web工程),在src中新建一个包,包名字叫servlet:再新建一 ...
- SSH(2)-- ssh_config和sshd_config
假定服务器ip为192.168.1.139,ssh服务的端口号为22,服务器上有个用户为pi,两边都是ubuntu. ssh_config和sshd_config都是ssh服务器的配置文件,二者区别在 ...