Oracle 用户事件触发器

合集下载

oracle 触发器工作原理

oracle 触发器工作原理

oracle触发器工作原理Oracle数据库中的触发器是一种存储过程,它在特定的数据库操作(如INSERT、UPDATE或DELETE)发生时自动执行。

触发器可以用于实现数据一致性、审计、业务规则验证和复杂的数据处理逻辑。

以下是Oracle触发器工作原理的基本概述:1.定义与激活:在Oracle中,通过使用CREATE TRIGGER语句创建触发器,指定其名称、触发时机(BEFORE或AFTER)、触发事件(INSERT、UPDATE、DELETE或COMMIT等)以及作用的对象(表或视图)。

2.触发时机:BEFORE触发器会在实际操作之前执行,此时可以查看并修改将要插入、更新或删除的数据。

AFTER触发器则在实际操作完成之后执行,此时只能查看已经更改后的结果。

3.触发上下文:对于INSERT操作,触发器可以通过:NEW伪记录访问被插入的新行数据。

对于UPDATE操作,触发器同时可以获得:OLD和:NEW伪记录,分别代表更新前的老数据和更新后的新数据。

对于DELETE操作,触发器可以通过:OLD伪记录访问即将被删除的行数据。

4.执行逻辑:触发器内的PL/SQL代码会根据触发条件进行执行,可以包含任何合法的PL/SQL命令,包括对其他表的操作、控制流语句、异常处理等。

5.事务处理:触发器是事务的一部分,所以它们遵循ACID属性,并且其行为受当前事务的影响。

例如,如果事务回滚,则触发器所做的所有变更也会随之回滚。

6.实例应用:举例来说,一个AFTER INSERT触发器可能用来记录新插入数据到审计表中;而一个BEFORE UPDATE触发器可能用于检查更新的数据是否满足某些业务规则,如果不满足则阻止更新操作。

总之,Oracle触发器是数据库系统内嵌的一种自动化机制,它在特定数据库事件发生时自动执行预定义的逻辑,为确保数据完整性和业务规则得以强制执行提供了强大的支持。

oracle触发器执行顺序

oracle触发器执行顺序

oracle触发器执行顺序2010-9-13表:emp--创建包变量CREATE PACKAGE EMP_PACKAGE lSold_sum NUMBER;--存放原来薪水总额new_sum NUMBER;--存放新的薪水总额test1 number;--before upate 对应值1test2 number;--before update each row 对应值2test3 number;--after update each row 对应值3test4 number;--after update 对应值4END;注:每个触发器执行都会对应上面变量进行赋值业务规则1:给员工加薪时,要扣税,扣税的规则是,原来薪水在5000或以上的扣除总薪水的10%,小于5000的扣除总薪水的20%业务规则2:如果目前全体员工的总薪水大于或等于15000,则不能加薪了;如果总薪水小于10000,则不能减薪了。

一.不同类型触发器(行级和语句)1.before触发器--原来总薪水总额(语句)CREATE OR REPLACE TRIGGER before_update_salaryBEFORE UPDATE ON EMPbeginSELECT SUM(salary)INTO EMP_PACKAGE.old_sum FROM EMP;EMP_PACKAGE.TEST1:=1;/*RAISE_APPLICATION_ERROR(-20003,nvl(EMP_PACKAGE.test2,0));*/end;--更改每行数据(行级)CREATE OR REPLACE TRIGGER before_add_salaryBEFORE UPDATE ON EMPFOR EACH rowBEGINif:new.salary>:OLD.salary THEN --加薪if:old.salary <5000THEN:NEW.salary :=:NEW.salary*0.8;RAISE_APPLICATION_ERROR(-20004,nvl(EMP_PACKAGE.test1,0));EMP_PACKAGE.TEST2:=2;ELSE:NEW.salary :=:NEW.salary*0.9;RAISE_APPLICATION_ERROR(-20005,nvl(EMP_PACKAGE.test1,0));EMP_PACKAGE.TEST2:=2;END IF;END IF;END;---现在对empno =5的员工薪水改为8000,执行得到以下报错(屏蔽before_update_salary报错)--现在对empno =5的员工薪水改为8000,执行得到以下报错(屏蔽before_add_salary报错)2.after触发器--判断员工新薪水(行级)create or replace trigger after_update_salary_rowafter UPDATE ON EMPfor each rowbeginif:new.salary>:OLD.salary THENif:new.salary <5000THEN/*RAISE_APPLICATION_ERROR(-20006,nvl(EMP_PACKAGE.test4,0));*/EMP_PACKAGE.test3:=3;ELSE/* RAISE_APPLICATION_ERROR(-20007,nvl(EMP_PACKAGE.test4,0));*/ EMP_PACKAGE.test3:=3;END IF;END IF;end;----判断是否可以加薪或减薪(语句)create or replace trigger after_update_salaryafter UPDATE ON EMPbeginSELECT SUM(salary)INTO EMP_PACKAGE.new_sum FROM EMP;if EMP_PACKAGE.new_sum> EMP_PACKAGE.old_sum thenif EMP_PACKAGE.old_sum>=15000thenRAISE_APPLICATION_ERROR(-20008,nvl(EMP_PACKAGE.test3,0));EMP_PACKAGE.test4:=4;end if;elseif EMP_PACKAGE.old_sum<10000thenRAISE_APPLICATION_ERROR(-20009,nvl(EMP_PACKAGE.test3,0));EMP_PACKAGE.test4:=4;end if;end if;end;--现在对empno =5的员工薪水改为8000,执行得到以下报错(屏蔽after_update_salary_row 报错)--现在对empno =5的员工薪水改为8000,执行得到以下报错(屏蔽after_update_salary报错)综合以上结果:oracle 一个表上的多个触发器的执行顺序如下:before 语句trigger->before 行级trigger->after 行级trigger->after 语句trigg er。

Oracle触发器trigger详解

Oracle触发器trigger详解

Oracle触发器trigger详解触发器相关概念及语法,供⼤家参考,具体内容如下概述本篇博⽂中主要探讨以下内容:什么是触发器触发器的应⽤场景触发器的语法触发器的类型案例数据:触发器的概念和第⼀个触发器数据库触发器是⼀个与表相关联的,存储的PL/SQL 语句。

每当⼀个特定的数据操作语句(insert update delete)在指定的表上发出时,Oracle⾃动执⾏触发器中定义的语句序列。

举个简单的例⼦:当员⼯表中新增⼀条记录后,⾃动打印“成功插⼊新员⼯”create or replace trigger insertStaffHintafter insert on xgj_testfor each rowdeclare-- local variables herebegindbms_output.put_line('新增员⼯成功');end insertStaffHint;触发器的应⽤场景复杂的安全性检查数据的确认数据库审计数据的备份和审计触发器的语法CREATE [OR REPLACE] TRIGGER trigger_name{BEFORE | AFTER }{INSERT | DELETE | UPDATE [OF column [, column …]]}[OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...]ON [schema.]table_name | [schema.]view_name[REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}][FOR EACH ROW ][WHEN condition]PL/SQL_BLOCK | CALL procedure_name;其中:BEFORE 和AFTER指出触发器的触发时序分别为前触发和后触发⽅式,前触发是在执⾏触发事件之前触发当前所创建的触发器,后触发是在执⾏触发事件之后触发当前所创建的触发器。

触发器类型

触发器类型

触发器是许多关系数据库系统都提供的一项技术。

在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块。

触发器类型触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行。

即触发器是当某个事件发生时自动地隐式运行。

并且,触发器不能接收参数。

所以运行触发器就叫触发或点火(firing)。

ORACLE事件指的是对数据库的表进行的INSERT、UPDATE及DELETE操作或对视图进行类似的操作。

ORACLE将触发器的功能扩展到了触发ORACLE,如数据库的启动与关闭等。

所以触发器常用来完成由数据库的完整性约束难以完成的复杂业务规则的约束,或用来监视对数据库的各种操作,实现审计的功能。

1 DML触发器ORACLE可以在DML语句进行触发,可以在DML操作前或操作后进行触发,并且可以对每个行或语句操作上进行触发。

2 替代触发器由于在ORACLE里,不能直接对由两个以上的表建立的视图进行操作。

所以给出了替代触发器。

它就是ORACLE 8专门为进行视图操作的一种处理方法。

3 系统触发器ORACLE 8i 提供了第三种类型的触发器叫系统触发器。

它可以在ORACLE数据库系统的事件中进行触发,如ORACLE系统的启动与关闭等。

触发器组成:触发事件:引起触发器被触发的事件。

例如:DML语句(INSERT, UPDA TE, DELETE 语句对表或视图执行数据处理操作)、DDL语句(如CREATE、ALTER、DROP语句在数据库中创建、修改、删除模式对象)、数据库系统事件(如系统启动或退出、异常错误)、用户事件(如登录或退出数据库)。

触发时间:即该TRIGGER 是在触发事件发生之前(BEFORE)还是之后(AFTER)触发,也就是触发事件和该TRIGGER 的操作顺序。

触发操作:即该TRIGGER 被触发之后的目的和意图,正是触发器本身要做的事情。

Oracle触发器操作

Oracle触发器操作

AS
SELECT * FROM Users
WHERE u_Name='amy';

(2)创建行级触发器

CREATE OR REPLACE TRIGGER tr_DeleteUser2 AFTER DELETE
2020/10/15 Or acle 数 据库 管理 与 应用 实例 教 程
课堂案例2—使用PL/SQL管理触发器
案例完成步骤-创建触发器
添加标 【例2-4】通过临时表将Users表中删除的记录进行临时保存(行级触发器)。
(1)创建行级触发器的测试表 CREATE TABLE userdel
题文字
建议课时:8课时
2020/10/15 Or acle 数 据库 管理 与 应用 实例 教 程
9.1 触发器概述
触发器简介 触发器是一种特殊的存储过程,它与数据表紧密联系,用于保护表中的 数据,当一个定义了特定类型触发器的基表执行插入、修改或删除表中 数据的操作时,将自动触发触发器中定义的操作,以实现数据的一致性 和完整性。 触发器拥有比数据库本身标准的功能更精细和更复杂的数据控制能力。 触发器具有以下的作用: (1)在安全性方面,触发器可以基于数据库的值使用户具有操作数据 库的某种权利。 (2)在审计方面,触发器可以跟踪用户对数据库的操作。 (3)实现复杂的数据完整性规则。 (4)实现复杂的非标准的数据库相关完整性规则。触发器可以对数据 库中相关的表进行连环更新。 (5)同步实时地复制表中的数据。 (6)自动计算数据值,如果数据的值达到了一定的要求,则进行特定 的处理。例如,如果商品的数量低于5,则立即给管理人员发送库存报 警信息。

WHO VARCHAR2(30),

oracle触发器的实例(转)

oracle触发器的实例(转)

oracle触发器的实例(转)触发器使⽤教程和命名规范⽬录触发器使⽤教程和命名规范 11,触发器简介 12,触发器⽰例 23,触发器语法和功能 34,例⼀:⾏级触发器之⼀ 45,例⼆:⾏级触发器之⼆ 46,例三:INSTEAD OF触发器 67,例四:语句级触发器之⼀ 88,例五:语句级触发器之⼆ 99,例六:⽤包封装触发器代码 1010,触发器命名规范 111,触发器简介触发器(Trigger)是数据库对象的⼀种,编码⽅式类似存储过程,与某张表(Table)相关联,当有DML语句对表进⾏操作时,可以引起触发器的执⾏,达到对插⼊记录⼀致性,正确性和规范性控制的⽬的。

在当年C/S时代盛⾏的时候,由于客户端直接连接数据库,能保证数据库⼀致性的只有数据库本⾝,此时主键(Primary Key),外键(Foreign Key),约束(Constraint)和触发器成为必要的控制机制。

⽽触发器的实现⽐较灵活,可编程性强,⾃然成为了最流⾏的控制机制。

到了B/S时代,发展成4层架构,客户端不再能直接访问数据库,只有中间件才可以访问数据库。

要控制数据库的⼀致性,既可以在中间件⾥控制,也可以在数据库端控制。

很多的青睐Java的开发者,随之将数据库当成⼀个⿊盒,把⼤多数的数据控制⼯作放在了Servlet中执⾏。

这样做,不需要了解太多的数据库知识,也减少了数据库编程的复杂性,但同时增加了Servlet编程的⼯作量。

从架构设计来看,中间件的功能是检查业务正确性和执⾏业务逻辑,如果把数据的⼀致性检查放到中间件去做,需要在所有涉及到数据写⼊的地⽅进⾏数据⼀致性检查。

由于数据库访问相对于中间件来说是远程调⽤,要编写统⼀的数据⼀致性检查代码并⾮易事,⼀般采⽤在多个地⽅的增加类似的检查步骤。

⼀旦⼀致性检查过程发⽣调整,势必导致多个地⽅的修改,不仅增加⼯作量,⽽且⽆法保证每个检查步骤的正确性。

触发器的应⽤,应该放在关键的,多⽅发起的,⾼频访问的数据表上,过多使⽤触发器,会增加数据库负担,降低数据库性能。

oracle 触发器case 写法

oracle 触发器case 写法

Oracle触发器是一种特殊类型的存储过程,它可以在特定的数据库操作发生时自动执行。

在实际应用中,我们经常会遇到需要使用Oracle触发器来实现一些复杂的业务逻辑。

在使用Oracle触发器时,我们需要根据具体的业务需求来设计触发器的逻辑,而针对不同的场景,需要使用不同的触发器写法。

本文将针对Oracle触发器的不同应用场景,介绍其对应的写法和注意事项。

一、触发器简介1.1 触发器概述Oracle触发器是一种特殊的数据库对象,它会在特定的数据库操作(如INSERT、UPDATE、DELETE)发生时自动触发执行。

触发器可以在数据库级别定义,对于特定的表和事件进行相应的响应操作。

在实际应用中,触发器常用于实现数据完整性约束、数据审计、实时计算等功能。

1.2 触发器类型在Oracle数据库中,触发器主要分为行级触发器和语句级触发器两种类型。

行级触发器会在每一行数据被操作时触发执行,而语句级触发器则会在整个SQL语句执行完成时触发执行。

在设计触发器时,需要根据具体的业务需求来选择合适的触发器类型。

二、Oracle触发器的应用场景及写法2.1 实现数据完整性约束在数据库中,我们经常需要实现一些数据完整性约束,如主键约束、外键约束等。

而触发器可以作为实现这些约束的一种手段。

我们可以使用触发器在插入或更新数据时,对数据进行校验,确保符合特定的约束条件。

对于主键约束,我们可以使用BEFORE INSERT触发器来实现,在数据插入前对主键进行校验,防止重复插入数据。

示例代码如下:```sqlCREATE OR REPLACE TRIGGER trg_check_pkBEFORE INSERT ON table_nameFOR EACH ROWDECLAREv_count NUMBER;BEGINSELECT COUNT(*) INTO v_countFROM table_nameWHERE primary_key = :new.primary_key;IF v_count > 0 THENR本人SE_APPLICATION_ERROR(-0, 'Primary key already exists');END IF;END;/```对于外键约束,我们可以使用AFTER INSERT、AFTER UPDATE触发器来实现,在数据插入或更新后对外键进行校验,确保引用的数据存在。

oracle触发器加条件判断

oracle触发器加条件判断

⽬录1.2.3.1.2.3. oracle触发器加条件判断oracle触发器加条件判断,如果某个字段,isnode=0,那么不执⾏下⾯的⽅法,数据如下:create or replace trigger tr_basestation_insert_empbefore insert on BJLT.BASESTATIONREFERENCING NEW AS new_val OLD AS old_val --在这⾥设置名字,然后可引⽤新值,旧值for each rowwhen (new_val.isnode =0)declare--local variables herebegininsert into BSMS.BS_INFO@TOBSMS_BETTERY_(INFOID, INFONAME, GROUPID, ADDRESS, BUILDDATE, MAINTENANCER, TEL, TEMPERATURE, RECTIFIERCUR, OUTVOL, CREATETIME, SORTID, ONEOFFVOL, TWOOFFVOL, ISNODE, NODENUM, ONOFFPOWER, ONOFFPOWERMODEL,POWERA, POWERB, POWERC, POWEROUT, POWERACUR, POWERBCUR, POWERCCUR, POWERAVOL, POWERBVOL,POWERCVOL, DOOROPEN, HS, YANGAN, SHUIJIN, HONGWAI, KONGTIAO, VERID)values ('1','1','8a82fcd4-eba9-4f83-82d6-8ded897f3f10','1',sysdate,'1','1',0,'1',1,sysdate,1,1,1,1,1,'1','1',-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,-1,-1,-1,-1,1);end;参考⾃:/weiwenhp/article/details/9179891trigger和procedure,function类似,只不过它不能被显⽰调⽤,只能被某个事件触发然后oracle⾃动去调⽤.常⽤的⼀般是针对⼀个表或视图创建⼀个trigger,然后对表或视图做某些操作时触发trigger.当然除此之外还有,schema,database级别的 trigger.什么样的操作触发trigger常见的是DML(insert,update,delete) , DDL(create,alter,drop)语句.不常见的是schema级别trigger在session连接或断开时触发.database级别trigger在系统启动或退出时触发.你可能很容易发现如果是select查询操作就没法⽤到trigger,⽽有时可能我们想监测谁查看了⼀些敏感信息,此时只能⽤到⼀个叫FGA的东东,可以创建⼀个审计策略(可以看成加强版的trigger,FGA介绍详见:)使⽤触发器注意事项1.触发器不接受参数,⼀个表最多可有12个触发器(触发器类型刚好是12种),并且同⼀时间,同⼀事件,同⼀类型的触发器只能有⼀个(保证触发器操作不冲突嘛).2.触发器最⼤为32KB,由于⼤⼩受到限制⾃然也不能使⽤long,blob这样的⼤变量.如果实在是有复杂的逻辑,要弄个很复杂的触发器,可以通过procedure或function实现⼀部分功能,然后调⽤3.因为触发器实际上可以看作触发语句的⼀部分.所以得遵循⼀些约束条件,⽐如不能有事务控制语句 (commit,rollback,savepoint),DDL语句.为啥⼦呢,这些特殊语句与⼀般sql语句的最主要区别是涉及到commit的问题.所以如果触发语句只是⼀般语句的话⾃然不能因为trigger的操作带有commit这样的特性了.创建触发器针对表或视图的触发器格式如下:CREATE [OR REPLACE] TRIGGER trigger_name{BEFORE | AFTER }{INSERT | DELETE | UPDATE [OF column [, column …]]}[OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...]ON [schema.]table_name | [schema.]view_name[REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}][FOR EACH ROW ][WHEN condition]PL/SQL_BLOCK | CALL procedure_name;先来看⼀个简单的,statement级别的trigger怎么创建.假如有表tb1,每insert⼀点就通过trigger在tblog中记录⼀些信息.create or replace trigger tb1_triggerafter insert on tb1referencing new as new old as olddeclarev_info varchar2(100);beginv_info := "do a insert";insert into tblog(info) values(v_info);end;trigger的创建中有个不太容易理解的内容:⼀针对row级别的trigger旧值新值问题row级别trigger旧值新值针对⼀个表或视图创建trigger时分为statement级别与row级别的trigger.所谓statement级别是说⼀个sql语句触发⼀次trigger,⽽如果是row级别则⼀个sql语句涉及到多⾏数据则trigger会被触发多次.⽽旧值就是指要更改的那⼀⾏数据在被改之前的值,新值就是⽤户更新后值.假如表tt只有⼀列⼀⾏数据:88.然后⽤户执⾏语句update tt set id = 99 where id = 88;则旧值指88,新值指99.那你们可能会问⽤什么⽅式去得到旧值或新值啊.来举例看下假如有表tb(eno int); 和表tblog( info varchar2(100)); 假如在tb上创建trigger,tb每update⼀次则在tblog中记录旧值就更改后的新值.CREATE OR REPLACE TRIGGER tb_triggerBEFORE UPDATEON tbREFERENCING NEW AS new_val OLD AS old_val --在这⾥设置名字,然后可引⽤新值,旧值.如果不指定默认值为new ,old.可以通过:new或:old去引⽤FOR EACH ROWDECLAREv_info varchar2(100);BEGINv_info := 'old value:' ||to_char( :old_val.eno) || 'new value:' || to_char(:new_val.eno);insert into tblog values(v_info);END;条件判断假如只有在涉及到某⼀⾏的操作时触发trigger,假如该触发器是针对updat,delete,insert都触发的情形.咋整呢,⾃然是多⽤些when去判断啊.例如CREATE OR REPLACE TRIGGER tb_triggerBEFORE UPDATE or insert or deleteON tbREFERENCING NEW AS new_val OLD AS old_val --在这⾥设置名字,然后可引⽤新值,旧值FOR EACH ROWwhen (old_val.eno = 99)DECLAREv_info varchar2(100);BEGINcasewhen updating thenv_info := 'old value:' ||to_char( :old_val.eno) || 'new value:' || to_char(:new_val.eno);insert into tblog values(v_info);when inserting thennull;when deleting thennull;end case;END;。

oracle序列和触发器

oracle序列和触发器

oracle序列和触发器1、创建表t1 :create table t1 (id number,name nvarchar(8));2、创建序列:CREATE SEQUENCE t1_id INCREMENT BY 1 START WITH 1 MAXV ALUE 1.0E28 MINV ALUE 1 NOCYCLE CACHE 20 NOORDER3. 创建触发器:CREATE TRIGGER tig_insert_t1BEFORE INSERT ON "YINZQ"."T1"beginif (:new.id is null) thenselect t1_id.nextval into :new.id from dual; //其中的:new.id 指的是t1表中新行的列end if;end;Oracle触发器语法触发器是特定事件出现的时候,自动执行的代码块。

类似于存储过程,触发器与存储过程的区别在于:存储过程是由用户或应用程序显式调用的,而触发器是不能被直接调用的。

功能:1、允许/限制对表的修改2、自动生成派生列,比如自增字段3、强制数据一致性4、提供审计和日志记录5、防止无效的事务处理6、启用复杂的业务逻辑触发器触发时间有两种:after和before。

1、触发器的语法:CREATE [OR REPLACE] TIGGER触发器名触发时间触发事件ON表名[FOR EACH ROW]BEGINpl/sql语句END其中:触发器名:触发器对象的名称。

由于触发器是数据库自动执行的,因此该名称只是一个名称,没有实质的用途。

触发时间:指明触发器何时执行,该值可取:before---表示在数据库动作之前触发器执行;after---表示在数据库动作之后出发器执行。

触发事件:指明哪些数据库动作会触发此触发器:insert:数据库插入会触发此触发器;让oracle实现自增字段先建序列,然后建立一个触发器实现!cata0是表名,cata0_id是需要自增的字段!CREATE SEQUENCE SEQ_cata0INCREMENT BY 1START WITH 1MAXV ALUE 9999999CREATE TRIGGER TRG_cata0 BEFOREINSERT ON cata0FOR EACH ROW beginSELECT SEQ_cata0.NEXTV ALINTO :NEW.cata0_IDfrom DUAL;End TRG_cata0;/****@PARAM STNAME 不要创建序列的表,多个表则以“,”隔开**/CREATE OR REPLACE PROCEDURE PROC_CREATE_SEQ_TRIG(STNAME IN V ARCHAR2)ASSTRSQL VARCHAR2(4000);TABLENAME V ARCHAR2(50);PID V ARC ......。

Oracle存储过程和触发器基本操作

Oracle存储过程和触发器基本操作

南华大学计算机科学与技术学院实验报告(2012~2013 学年度第二学期)课程名称Oracle高级数据库开发设计实验名称存储过程与触发器基本操作姓名学号专业班级地点教师前提表脚本:create table S_RZ0122 (Sno varchar2(11) primary key,Sname varchar2(20) not null,Ssex varchar(2) not null ,Sage number(2) not null,Sdept varchar(20) not null)create table C_RZ0122(Cno varchar2(20) primary key,Cname varchar2(20) not null ,Ccredit number(2) not null)create table SC_RZ0122(Sno varchar2(11) not null,Cno varchar2(20) not null,Score number(3) ,primary key(Sno ,Cno),foreign key(Sno) references S_RZ0122(Sno),foreign key(Cno) references C_RZ0122(Cno))INSERT INTO S_RZ0122 (Sno ,Sname,Ssex,Sage ,Sdept) V ALUES(0811101,'李勇','男',21,'计算机系')INSERT INTO S_RZ0122 (Sno ,Sname,Ssex,Sage ,Sdept) V ALUES(0811102,'刘晨','男',20,'计算机系')INSERT INTO S_RZ0122 (Sno ,Sname,Ssex,Sage ,Sdept) V ALUES(0811103,'王敏','女',20,'计算机系')INSERT INTO S_RZ0122 (Sno ,Sname,Ssex,Sage ,Sdept) V ALUES(0811104,'张小红','女',19,'计算机系')INSERT INTO S_RZ0122 (Sno ,Sname,Ssex,Sage ,Sdept) V ALUES(0821101,'张立','男',20,'信息管理系')INSERT INTO S_RZ0122 (Sno ,Sname,Ssex,Sage ,Sdept) V ALUES(0821102,'吴宾','女',19,'信息管理系')INSERT INTO S_RZ0122 (Sno ,Sname,Ssex,Sage ,Sdept) V ALUES(0821103,'张海','男',20,'信息管理系')INSERT INTO S_RZ0122 (Sno ,Sname,Ssex,Sage ,Sdept) V ALUES(0831101,'钱小平','女',21,'通信工程系')INSERT INTO S_RZ0122 (Sno ,Sname,Ssex,Sage ,Sdept) V ALUES(0831102,'王大力','男',20,'通信工程系')INSERT INTO S_RZ0122 (Sno ,Sname,Ssex,Sage ,Sdept) V ALUES(0831103,'张珊珊','女',19,'通信工程系')---增加课程信息脚本:---insert allINSERT INTO C_RZ0122 (Cno ,Cname ,Ccredit ) V ALUES ('C001','高等数学',4) INSERT INTO C_RZ0122 (Cno ,Cname ,Ccredit ) V ALUES ('C002','大学英语',3) INSERT INTO C_RZ0122 (Cno ,Cname ,Ccredit ) V ALUES ('C003','大学英语',3) INSERT INTO C_RZ0122 (Cno ,Cname ,Ccredit ) V ALUES ('C004','计算机文化学',2) INSERT INTO C_RZ0122 (Cno ,Cname ,Ccredit ) V ALUES ('C005','VB',2)INSERT INTO C_RZ0122 (Cno ,Cname ,Ccredit ) V ALUES ('C006','数据库基础',4) INSERT INTO C_RZ0122 (Cno ,Cname ,Ccredit ) V ALUES ('C007','数据结构',4) INSERT INTO C_RZ0122 (Cno ,Cname ,Ccredit ) V ALUES ('C008','计算机网络',4) select * from C_RZ0122;---增加关联学生和课程信息脚本:---INSERT ALLINSERT INTO SC_RZ0122(Sno,Cno,Score) V ALUES (0811101,'C001',96)INSERT INTO SC_RZ0122(Sno,Cno,Score) V ALUES (0811101,'C002',80)INSERT INTO SC_RZ0122(Sno,Cno,Score) V ALUES (0811101,'C003',84)INSERT INTO SC_RZ0122(Sno,Cno,Score) V ALUES (0811101,'C005',62)INSERT INTO SC_RZ0122(Sno,Cno,Score) V ALUES (0811102,'C001',92)INSERT INTO SC_RZ0122(Sno,Cno,Score) V ALUES (0811102,'C002',90)INSERT INTO SC_RZ0122(Sno,Cno,Score) V ALUES (0811102,'C004',84)INSERT INTO SC_RZ0122(Sno,Cno,Score) V ALUES (0821102,'C001',76)INSERT INTO SC_RZ0122(Sno,Cno,Score) V ALUES (0821102,'C004',85)INSERT INTO SC_RZ0122(Sno,Cno,Score) V ALUES (0821102,'C005',73)INSERT INTO SC_RZ0122(Sno,Cno,Score) V ALUES (0821102,'C007',0)INSERT INTO SC_RZ0122(Sno,Cno,Score) V ALUES (0821103,'C001',50)INSERT INTO SC_RZ0122(Sno,Cno,Score) V ALUES (0821103,'C004',80)INSERT INTO SC_RZ0122(Sno,Cno,Score) V ALUES (0831101,'C001',50)INSERT INTO SC_RZ0122(Sno,Cno,Score) V ALUES (0831101,'C004',80)INSERT INTO SC_RZ0122(Sno,Cno,Score) V ALUES (0831102,'C007',0)INSERT INTO SC_RZ0122(Sno,Cno,Score) V ALUES (0831103,'C004',78)INSERT INTO SC_RZ0122(Sno,Cno,Score) V ALUES (0831103,'C005',65)INSERT INTO SC_RZ0122(Sno,Cno,Score) V ALUES (0831103,'C007',0)select Sno,Cno,Score from SC_RZ0122;一.实验题目存储过程与触发器基本操作二.实验要求掌握对存储过程和触发器的创建、修改等基本操作。

oracle 触发器的种类和触发事件,dml触发器,ddl事件触发器,替代触发器,查看触发

oracle 触发器的种类和触发事件,dml触发器,ddl事件触发器,替代触发器,查看触发

oracle 触发器的种类和触发事件,DML触发器,DDL事件触发器,替代触发器,查看触发...oracle 数据库开发应用实例,招生录取系统 ... | oracle 创建,删除存储过程,参数传递,创 ...2009-04-14oracle 触发器的种类和触发事件,DML触发器,DDL事件触发器,替代触发器,查看触发器,关键字: oracle 触发器种类触发事件dml ddl 事件替代查看触发器的种类和触发事件触发器必须由事件才能触发。

触发器的触发事件分可为3类,分别是DML事件、DDL事件和数据库事件。

每类事件包含若干个事件,如下所示。

数据库的事件是具体的,在创建触发器时要指明触发的事件。

种类关键字含义Sql代码DML事件(3种) INSERT 在表或视图中插入数据时触发UPDATE 修改表或视图中的数据时触发DELETE 在删除表或视图中的数据时触发DDL事件(3种) CREATE 在创建新对象时触发ALTER 修改数据库或数据库对象时触发DROP 删除对象时触发数据库事件(5种) STARTUP 数据打开时触发SHUTDOWN 在使用NORMAL或IMMEDIATE选项关闭数据库时触发LOGON 当用户连接到数据库并建立会话时触发LOGOFF 当一个会话从数据库中断开时触发SERVERERROR 发生服务器错误时触发DML事件(3种) INSERT 在表或视图中插入数据时触发UPDATE 修改表或视图中的数据时触发DELETE 在删除表或视图中的数据时触发DDL事件(3种) CREATE 在创建新对象时触发ALTER 修改数据库或数据库对象时触发DROP 删除对象时触发数据库事件(5种) STARTUP 数据打开时触发SHUTDOWN 在使用NORMAL或IMMEDIATE选项关闭数据库时触发LOGON 当用户连接到数据库并建立会话时触发LOGOFF 当一个会话从数据库中断开时触发SERVERERROR 发生服务器错误时触发触发器的类型可划分为4种:数据操纵语言(DML)触发器、替代(INSTEAD OF)触发器、数据定义语言(DDL)触发器和数据库事件触发器。

oracle触发器-解决mutating table的问题

oracle触发器-解决mutating table的问题

Oracle触发器mutating table问题解决方案一、问题描述Oracle触发器是特定事件出现的时候,自动执行的代码块。

但在使用过程中,往往遇到如下需求:1、在触发器执行时,使用DML语言操作触发器的基础表,完成更新、插入或删除操作;2、触发器对于父子表,即有外键关联的表的相关操作;或者说trigger访问了自身上的表。

在以上两种情况下,依据Oracle的事务处理规则,通常产生如下错误:ORA-04091。

该错误解释为:当前的trigger下的事物,access(执行)了一个mutating table(冲突的表)。

一个简单的例子拿oracle的示例表emp和dept来做这个试验。

dept的表结构如下:emp表结构如下:emp和dept是一对父子表,关联column为DEPTNO。

接下来创建1个table:emp_log 和1个语句级trigger: emp_del_trg。

取一个最简单的业务功能,emp_del_trg的作用就是当表emp记录被删除的时候,触发器将删除的记录的EMPNO,DNAME和删除时间写入到emp_log中,当子表依赖的父表相关记录删除的时候,emp_log不做处理。

表emp_log的结构如下:触发器trigger代码如下:来看看这个触发器是否能正常工作,首先删除emp的记录。

看似trigger工作正常,删除dept的记录呢?问题分析:ORA-04091错误如约而至。

不难解释,因为父子表指定了级联删除,删除dept的记录从而引起删除emp表上的相应数据,然后触发了emp_del_trg,由于trigger里有对dept的访问,对当前事务说,dept就是一个mutating table,这是不被允许的。

如何来解决这个问题而实现这个简单的业务逻辑功能呢?当然,从表结构逻辑设计上来讲,可以将dept表上的dname字段add到emp表,或者不要显式的指定references,用程序来维护数据的完整性和约束,然后调整业务代码.最直接的方法,在trigger中声明一个ora-04091的exception,对此异常不做处理,也可完成目的。

oracle 触发器(trigger)

oracle 触发器(trigger)

触发器的使用1触发器资料来源:《/view/71791.htm?fr=ala0_1_1》触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作(insert,delete,update)时就会激活它执行。

触发器经常用于加强数据的完整性约束和业务规则等。

触发器可以从DBA_TRIGG ERS ,USER_TRIGGERS 数据字典中查到。

1.1 数据库领域名词触发器可以查询其他表,而且可以包含复杂的SQL语句。

它们主要用于强制服从复杂的业务规则或要求。

例如:您可以根据客户当前的帐户状态,控制是否允许插入新订单。

触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。

然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。

如果使用数据库关系图,则可以在表之间创建关系以自动创建外键约束。

1.2 创建触发器的SQL语法DELIMITER |CREATE TRIGGER `<databaseName>`.`<triggerName>`< [ BEFORE | AFTER ] > < [ INSERT | UPDATE | DELETE ] >ON <tableName>FOR EACH ROWBEGIN--do somethingEND |1.3 触发器的优点触发器可通过数据库中的相关表实现级联更改;不过,通过级联引用完整性约束可以更有效地执行这些更改。

触发器可以强制比用CHECK 约束定义的约束更为复杂的约束。

与CHECK 约束不同,触发器可以引用其它表中的列。

例如,触发器可以使用另一个表中的SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。

触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。

oracle触发器相关参数

oracle触发器相关参数

oracle触发器相关参数Oracle触发器是一种在数据库中定义的特殊类型的存储过程,可以在执行特定的数据库操作时自动触发。

触发器使用一组定义在数据库表上的规则来监视数据的变化,并在满足特定条件时执行相应的动作。

触发器有许多参数可以定义和配置,以下是一些常用的触发器相关参数:1. 触发事件(Triggering Event):触发器可以定义在不同的事件上,如INSERT、UPDATE和DELETE等。

当满足触发事件时,触发器将被激活执行。

2. 触发器类型(Trigger Type):Oracle触发器主要分为行级触发器和语句级触发器两种类型。

行级触发器在每一行数据修改时被激活,而语句级触发器在每次执行SQL语句时被激活。

3. 触发时间(Triggering Time):触发器可以定义在不同的时间点上,如BEFORE和AFTER。

BEFORE触发器在操作执行之前触发,而AFTER触发器在操作执行之后触发。

4. 触发器限制(Trigger Restrictions):触发器可以受到一些限制,如触发器的执行顺序、触发器的嵌套级别等。

这些限制可以保证触发器的执行顺序和一致性。

5. 触发器条件(Trigger Condition):触发器可以定义一些条件,只有满足条件时才会触发。

条件可以是简单的逻辑表达式或者复杂的SQL查询。

6. 触发器动作(Trigger Action):触发器可以定义在满足条件时执行的动作,可以是简单的SQL语句或者复杂的存储过程。

触发器可以修改数据、插入新的数据、删除数据等。

7. 触发器对象(Trigger Object):触发器可以定义在不同的数据库对象上,如表、视图和触发器本身。

触发器可以用于监视和控制不同对象的数据变化。

8. 触发器状态(Trigger Status):触发器可以被启用或禁用。

禁用触发器可以暂时停止触发器的执行,启用触发器可以重新激活触发器。

9. 触发器性能(Trigger Performance):触发器的性能是一个重要的考虑因素。

什么是触发器以及触发器的使用

什么是触发器以及触发器的使用
DML触发器 • 替代触发器 • 系统触发器
触发器的语法
触发器的一般语法:
CREATE [OR REPLACE] TRIGGER trigger_name {BEFORE | AFTER } {INSERT | DELETE | UPDATE [OF column [, column …]]} ON [schema.] table_name [REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}] [FOR EACH ROW ] [WHEN condition] trigger_body;
CREATE OR REPLACE VIEW emp_view AS SELECT deptno, count(*) total_employeer, sum(sal) total_salary FROM emp GROUP BY deptno;
在此视图中直接删除是非法: SQL>DELETE FROM emp_view WHERE deptno=10; DELETE FROM emp_view WHERE deptno=10 * ERROR 位于第 1 行: ORA-01732: 此视图的数据操纵操作非法
数据库TRIGGER的这两种状态可以互相转换。格式为: ALTER TIGGER trigger_name [DISABLE | ENABLE ]; 例:ALTER TRIGGER emp_view_delete DISABLE; ALTER TRIGGER语句一次只能改变一个触发器的状态,而ALTER TABLE语句则一次能够改变与指定表相关的所有触发器的使用 状态。格式为: ALTER TABLE [schema.]table_name {ENABLE|DISABLE} ALL TRIGGERS; 例:使表EMP 上的所有TRIGGER 失效: ALTER TABLE emp DISABLE ALL TRIGGERS;

oracle触发器触发条件

oracle触发器触发条件

oracle触发器触发条件
Oracle触发器触发条件
1、触发器的触发条件
在创建一个触发器时,可以通过两种方式来指定触发条件:BEFORE和AFTER。

(1)BEFORE
BEFORE触发器在触发前执行,它的行为与常规的SQL查询没有
任何不同,因此它具有在更新操作发生之前检查行是否满足特定条件、更新以符合要求的表或其他特定操作的能力,然后再运行更新操作。

(2)AFTER
AFTER触发器在触发后执行,它可以让用户在更新(增、删、改)操作发生之后可以运行操作,从而可以根据用户对表的更新操作的结果来完成操作,其中更新或删除的行已经提交而不会回滚,而且不能更新触发器的父表。

2、触发器的触发时机
在创建一个触发器时,可以指定触发器的触发时机,它可以是一个表属性和操作:
(1)BEFORE
BEFORE触发器指SQL语句或DML操作发生之前被触发,可以指
定成INSERT,UPDATE,DELETE,以及在多表中涉及的多个操作中的
任何一个。

(2)AFTER
AFTER触发器指SQL语句或DML操作发生之后被触发,可以指定成INSERT,UPDATE,DELETE,以及在多表中涉及的多个操作中的任何一个。

oracle 触发器case写法

oracle 触发器case写法

Oracle触发器是一种用于在数据库发生特定事件时自动执行某些操作的数据库对象。

触发器可以用于在数据插入、更新或删除时执行特定的逻辑,以确保数据的完整性和一致性。

在Oracle数据库中,触发器是一种强大的工具,可以帮助数据库开发人员实现复杂的业务逻辑和数据处理需求。

在使用Oracle触发器时,我们需要根据具体的业务需求来编写相应的触发器,以确保触发器能够正确地响应数据库中发生的事件,并执行相应的操作。

在编写Oracle触发器时,我们需要遵循一定的写法和规范,以确保触发器的可靠性和可维护性。

以下是关于Oracle触发器编写的一些常见的写法和注意事项:1. 指定触发器的事件类型和触发时机在编写Oracle触发器时,首先需要明确触发器要响应的事件类型和触发时机。

Oracle触发器可以在数据插入(INSERT)、更新(UPDATE)或删除(DELETE)时触发,我们需要根据具体的业务需求来选择合适的事件类型和触发时机。

2. 触发器的创建和定义在指定了触发器要响应的事件类型和触发时机之后,我们需要使用CREATE TRIGGER语句来创建和定义触发器。

在触发器的定义中,需要指定触发器的名称、所属的表名、触发时机以及触发器的逻辑。

3. 触发器的语法和逻辑在编写Oracle触发器的逻辑时,需要使用PL/SQL语言来实现触发器的逻辑。

我们可以在触发器中编写适当的PL/SQL代码来执行数据处理、业务逻辑或其他操作。

在编写触发器的逻辑时,需要确保逻辑的正确性和可靠性,以确保触发器能够正确地执行所需的操作。

4. 考虑触发器的性能和效率在编写Oracle触发器时,需要考虑触发器的性能和效率。

触发器的逻辑和操作可能会对数据库的性能产生影响,我们需要审慎地编写触发器的逻辑,以确保触发器能够在不影响数据库性能的情况下正确地执行所需的操作。

5. 测试和调试触发器在编写Oracle触发器之后,需要对触发器进行测试和调试,以确保触发器能够正确地响应所需的事件,并执行相应的操作。

oracle触发器delete写法

oracle触发器delete写法

概述:本文将针对Oracle数据库中触发器的delete写法展开讨论,通过逐步介绍触发器的基本概念和使用方法,深入探究delete触发器的写法以及相关注意事项。

文章将以从简到繁的方式,帮助读者全面理解delete触发器的实现原理和应用技巧。

一、触发器的基本概念和使用方法1.1 触发器的概念和作用在Oracle数据库中,触发器是一种特殊的存储过程,它是与表相关联的数据库对象,当表上出现特定的事件,比如insert、update或delete操作时,触发器会自动执行相应的动作。

1.2 触发器的创建和语法在创建触发器时,需要指定触发的事件(insert、update或delete)、触发的时机(before或after)以及触发的操作(行级触发器或语句级触发器)。

触发器的语法如下:```sqlCREATE [OR REPLACE] TRIGGER trigger_nameBEFORE/AFTER INSERT/UPDATE/DELETEON table_name[FOR EACH ROW]BEGIN-- 触发器执行的动作END;```1.3 触发器的应用场景触发器通常用于实现数据的自动化维护、约束的强制执行等应用场景。

delete触发器作为其中的一种,可以在数据删除操作时执行一系列特定的逻辑处理,保证数据的完整性和一致性。

二、delete触发器的写法及注意事项2.1 delete触发器的基本写法在创建delete触发器时,需要注意触发时机、执行动作和逻辑处理。

delete触发器通常在数据删除之前或之后执行,可以用于记录日志、更新相关数据等操作。

以下是delete触发器的基本写法示例:```sqlCREATE OR REPLACE TRIGGER delete_triggerBEFORE DELETEON table_nameFOR EACH ROWBEGIN-- 执行相关逻辑处理END;```2.2 delete触发器的注意事项在编写delete触发器时,需要注意以下几点:- 触发时机的选择:根据业务需求和数据完整性考虑,选择合适的触发时机(before或after)。

Oracle触发器详解

Oracle触发器详解

Oracle触发器详解一、触发器概述触发器是特定事件出现的时候,自动执行的代码块。

类似于存储过程,但是用户不能直接调用他们。

功能:1、 允许/限制对表的修改2、 自动生成派生列,比如自增字段3、 强制数据一致性4、 提供审计和日志记录5、 防止无效的事务处理6、 启用复杂的业务逻辑触发器触发时间有两种:after和before。

1、触发器的语法:CREATE [OR REPLACE] TIGGER触发器名 触发时间 触发事件ON表名[FOR EACH ROW]BEGINpl/sql语句END其中:触发器名:触发器对象的名称。

由于触发器是数据库自动执行的,因此该名称只是一个名称,没有实质的用途。

触发时间:指明触发器何时执行,该值可取:before---表示在数据库动作之前触发器执行;after---表示在数据库动作之后出发器执行。

触发事件:指明哪些数据库动作会触发此触发器:insert:数据库插入会触发此触发器;update:数据库修改会触发此触发器;delete:数据库删除会触发此触发器。

表名:数据库触发器所在的表。

for each row:对表的每一行触发器执行一次。

如果没有这一选项,则只对整个表执行一次。

触发器的组成部分:1、 触发器名称2、 触发语句3、 触发器限制4、 触发操作触发器类型:1、 语句触发器2、 行触发器3、 INSTEAD OF 触发器4、 系统条件触发器5、 用户事件触发器注释:before和after:指在事件发生之前或之后激活触发器。

instead of:如果使用此子句,表示可以执行触发器代码来代替导致触发器调用的事件。

insert、 delete和update:指定构成触发器事件的数据操纵类型,update还可以制定列的列表。

此类触发器用的不多,经常用于视图,不做重点。

table_or_view_name:指要创建触发器的表或视图的名称。

for each row:指定是否对受影响的每行都执行触发器,即行级触发器,如果不使用此子句,则为语句级触发器。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Oracle 用户事件触发器
用户事件触发器是建立在模式级的操作上的触发器。

激活该类型触发器的用户事件包括:CREATE、ALTER、DROP、ANAL YZE、ASSOCIATE STATISTICS、DISASSOCIATE 、STA TISTICS、COMMENT、GRANT、REVOKE、RENAME、TRUNCA TE、LOGOFF、SUSPEND 和LOGON。

下面的示例将创建一个用户模式级触发器,以记录用户删除的数据库对象。

(1)以SCOTT身份连接到数据,并建立一个日志信息表。

SQL> create table droped_objects(
2 object_name varchar2(30),
3 object_type varchar2(30),
4 dropped_on date);
表已创建。

(2)创建用户事件触发器,以便记录用户删除的数据库对象。

SQL> create or replace trigger log_drop_trigger
2 before drop on scott.schema
3 begin
4 insert into droped_objects values(
5 ora_dict_obj_name,
6 ora_dict_obj_type,
7 sysdate);
8 end;
9 /
触发器已创建
在编写用户事件触发器时,经常会需要使用一些事件属性函数,例如,上面示例中的ORA_DICT_OBJ_NAME和ORA_DICT_OBJ_TYPE函数。

常用的事件属性函数如表7-1所示。

表7-1 事件属性函数
事件属性函数说明
ora_client_ip_address 返回客户端的IP地址
ora_database_name 返回当前数据库名
ora_des_encrypted_password 返回DES加密后的用户口令
ora_dict_obj_name 返回DDL操作所对应的数据库对象名
ora_dict_obj_name_list(name_list out ora_name_list_t) 返回在事件中被修改的对象名列表
ora_dict_obj_owner 返回DDL操作所对应的对象的所有者名
ora_dict_obj_owner_list(owner_list out ora_name_list_t) 返回在事件中被修改的对象的所有者列表
ora_dict_obj_type 返回ddl操作所对应的数据库对象的类型
ora_grantee(user_list out ora_name_list_t) 返回授权事件的授权者
ora_instance_num 返回例程号
ora_is_alter_column(column_name in varchar2) 检测特定列是否被修改
ora_is_creating_nested_table 检测是否正在建立嵌套表
ora_is_drop_column(column_name in varchar2) 检测特定列是否被删除
ora_is_servererror(error_number) 检测是否返回了特定oracle错误ora_login_user 返回登录用户名
ora_sysevent 返回触发器的系统事件名(3)删除SCOTT模式下的一些表或视图,测试触发器的运行情况。

SQL> drop table foo;
表已删除。

SQL> drop view emp_dep_view;
视图已删除。

SQL> select * from droped_objects;
OBJECT_NAME OBJECT_TYPE DROPPED_ON ------------------------------ ------------------------------ --------------
FOO TABLE 02-5月-08
EMP_DEP_VIEW
VIEW
02-5月-08。

相关文档
最新文档