oracle触发器使用教程和命名规范

合集下载

触发器

触发器
• 数据库启动 • 数据库关闭 • 服务器错误
这些事件都是实例范围的。这些触发器 不像前面讲过的那些触发器一样,与特 定的表或视图关联。
用户事件触发器
用户事件触发器也称为客户触发器,是能够与 insert、update、delete以外的用户登录、注 销、DML、DDL操作事件相关联的触发器。 创建用户事件触发器,对用户userman所删除 的所有对象进行日志记录。
Instead of触发器
创建触发器
create trigger update_users_view instead of update on users_view begin update users set userid=:erid, username=:ername, salary=:new.salary where userid=:erid; end; /
行触发器
创建行触发器, 为主键提供默认设置 创建表
create table person ( personid number primary key, personname varchar2(20) );
行触发器
• create sequence person_seq;
序列已创建。
• • • • • •
Instead of触发器
创建连接视图user_view,显示用户名、 用户类型及类型名。
• • • • • • • 1、先给scott授权 SQL> conn sys/oracle as sysdba; 已连接。 SQL> grant create view to scott; 授权成功。 SQL> conn scott/oracle; 已连接。
已创建 1 行。

Oracle数据库技术触发器

Oracle数据库技术触发器
Oracle数据库技术触发器
触发器
可以使用触发器做许多事情,包括 1。维护不可能在表创建时刻通过声明性约 束进行的复杂的完整性约束限制。 2。通过记录所进行的修改以及谁进行了修 改来审计表中的信息。 3。当表被修改的时候,自动给其他需要执 行操作的程序发信号。
Oracle数据库技术触发器
触发器
触发器不可缺少的部件是触发器名、触发事件和 触发器主体。 1.触发器名
Oracle数据库技术触发器
Oracle数据库技术触发器
教学目标
❖ 掌握触发器的概念 ❖ 掌握触发器的定义和使用方法 ❖ 了解在触发器中如何抛出用户自
定义异常信息
Oracle数据库技术触发器
重点及难点
❖ 触发器定义 ❖ 触发器应用(难点)
Oracle数据库技术触发器
触发器
触发器类似于过程或函数,因为它们都是拥有声 明、执行和异常处理过程的带名PL/SQL块。与包 类似,触发器必须存储在数据库中并且不能被块 进行本地化声明。但是,对于过程而言.可以从 另一个块中通过过程调用显式地执行一个过程。 同时在调用时可以传递参数。对于触发器而言, 当触发事件发生时就会显式地执行该触发器。并 且触发器不接受参数。执行触发器的操作就是“点 火” (firing)触发器。触发器事件是在数据库表上 执行的DML(INSERT、UPDATE或DELETE)操作。
Oracle数据库技术触发器
对触发器的限制
触发器的主体是一个PL/SQL块。在PL/SQL块中可以使用的 所有语句在触发器主体中都是合法的,但是要受到下面限制 的约束:
1.触发器不应该使用事务控制语句-COMMIT, ROLLBACK或SAVEPOINT。触发器作为触发语句执行的一部 分被点火,它和触发语句在同一个事务中。当触发语句被提 交或撤回提交时,触发器的上作也相应被提交或撤回提交。

命名规范(Oracle数据库)

命名规范(Oracle数据库)

命名规范(Oracle数据库)1、表命名命名最好望⽂⽣义,避免使⽤[数据库]关键词命名⼀律为⼤写字母(或⼩写,不要⼤下写混合)英⽂单词单数命名,例:FACTORY英⽂单词缩写命名,例:DEPT英⽂单词之间⽤下划线连结,且每个单词皆为单数,例:TASK_RESULT⽤来存储历史资料,命名以HISTORY结尾,例:TASK_HISTORY⽤来存储⽇志资料,命名以LOG结尾,例:TASK_LOG⽤来存储类别资料,命名以TYPE结尾,例:TASK_TYPE2、表字段命名最好望⽂⽣义,避免使⽤数据库关键词英⽂单词单数命名,例:MAIL英⽂单词缩写命名,例:DEPT_ID英⽂单词之间⽤下划线连结,且每个单词皆为单数,例:USER_NAME字段⽤来存储流⽔号,命名以ID结尾,例: TASK_ID字段⽤来存储代码,命名以NO结尾,例: TASK_NO字段⽤来存储⽇期,命名以DATE结尾,例:CREATE_DATE字段⽤来存储数量,命名以QTY结尾,例:PLAN_QTY字段⽤来存储类别,命名以TYPE结尾,例:STATION_TYPE字段⽤来存储名称,命名以NAME结尾,例:ENDUSER_NAME字段⽤来存储描述,命名以DESC结尾,例:STATION_DESC字段⽤来存储代码,命名以CODE结尾,例:ERROR_CODE字段⽤来存储标志,命名以FLAG开头,例:DEBUG_FLAG3、索引命名以表名+ INDEX+两位流⽔号(01~99),例:ENDUSER_INDEX014、键值主键命名以表名+PK+⼀位流⽔号(1~9),例:DEPT_PK1附键命名以表名+AK+⼀位流⽔号(1~9),例:DEPT_AK1外键命名以表名+FK+⼀位流⽔号(1~9),例:DEPT_FK1检查条件以表名+CK+⼀位流⽔号(1~9),例:DEPT_CK15、视图命名以V_开头例:V_DEPT其它规则参考资料表命名规则6、触发器以表名+TR+⼀位流⽔号(1~9) 命名,例:DEPT_TR17、存储过程命名以PC开头实现单⼀资料表交易功能,以PC+表名命名,例:PC_LINE实现关联资料表交易功能,以PC+功能命名,例:PC_GETDATA命名需让⼈明⽩其主要功能8、函数检查功能的函数,以Is+检查项⽬命名,例:bool IsCharValid(char)获取资料功能的函数,以Get+数据项命名,例:string GetLineNo(char)设定资料功能的函数,以Set+数据项命名,例:int SetLineNo(char)9、序列命名以SEQ开头以表的字段名命名,例: SEQ_LINE_ID若与其它表的字段名相同,则以表名+字段名命名,例:SEQ_CODE_TYPE_ID10、表空间存储资料的命名为项⽬名称,例:CRM存储索引的命名为项⽬名称+IDX,例:CRMIDX存储历史的命名为项⽬名称+OLD,例:CRMOLD存储临时的命名为项⽬名称+LOG,例:CRMLOG11、数据⽂件命名以所属表空间开头+两位流⽔号(01~99)+,ORA,例:CRM01,ORA12、包命名以功能缩写开头+PKG+流⽔号(1~9),例:CRMPKG113、⽤户项⽬管理者以项⽬名称命名,例:CRM开发者通⽤名称DEVELOPER初学者通⽤名称BEGINNER。

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-教程-第9章-触发器课件

oracle-教程-第9章-触发器课件


* 确定触发时间。触发的时间有BEFORE
和AFTER两种,分别表示触发动作发生在DML语句执
行之前和语句执行之后。

* 确定触发级别,有语句级触发器和行级
触发器两种。语句级触发器表示SQL语句只触发一次
触发器,行级触发器表示SQL语句影响的每一行都要
触发一次。

由于在同一个表上可以定义多个DML触发
器,因此触发器本身和引发触发器的SQL语句在执行
的顺序上有先后的关系。它们的顺序是:

* 如果存在语句级BEFORE触发器,则先执
行一次语句级BEFORE触发器。
oracle-教程-第9章-触发器

* 在SQL语句的执行过程中,如果存在行
级BEFORE触发器,则SQL语句在对每一行操作之前,
都要先执行一次行级BEFORE触发器,然后才对行进

* 一个触发器可由多个不同的DML操作
触发。在触发器中,可用INSERTING、DELETING、
UPDATING谓词来区别不同的DML操作。这些谓词
可以在IF分支条件语句中作为判断条件来使用。

* 在行级触发器中,用:new 和:old(称为
伪记录)来访问数据变更前后的值。但要注意,
INSERT语句插入一条新记录,所以没有:old记录,
简称 DML 触发器 INSTEAD OF 触发器 DDL L 事件引发的触发器
创建在视图上,用来替换对视图进行的插入、删 除和修改操作
定义在模式上,触发事件是数据库对象的创建和 修改
定义在整个数据库或模式上,触发事件是数据库 事件
oracle-教程-第9章-触发器
9.2 DML触发器

Oracle数据库技术与应用课件:触发器

Oracle数据库技术与应用课件:触发器
应用。另外还将介绍Oracle中程序包的概念
触发器简介
• 触发器是一种过程,与表关系密切,用于保护表中的数据 • 当一个基表被修改(INSERT、UPDATE或DELETE)时,触发器自
动执行 • 触发器可实现多个表之间数据的一致性和完整性
触发器语法
• 创建触发器的具体语法:
CREATE [OR REPLACE] TRIGGER [schema.]trigger_name {BEFORE | AFTER | INSTEAD OF} /*定义触发器种类*/ {DELETE [OR INSERT] [OR UPDATE[OF column,…n]]} ON [schema.]table_name | view_name /*指定操作对象*/ [FOR EACH ROW [WHEN(condition)]] trigger_body
ALTER TRIGGER log_creations DISABLE ; • 重新启用log_creations触发器
ALTER TRIGGER log_creations ENABLE ;
触发器的修改与删除
• 删除触发器log_creations DROP TRIGGER log_creations ;
器 • DML触发器针对INSERT、UPDATE、DELETE操作,可以在这些操作之
前或之后触发。DML触发器又包括行级触发器和语句级触发器。 • INSTEAD OF触发器主要用于建立在多张基表上的视图。
:new.sal := :old.sal; /*新的工资赋予原来的值,即工资不变*/ end;
INSTEAD OF触发器
• INSTEAD OF触发器用于对视图的DML触发,主要用于多表联接的视图 • 例:在dept和emp表上建有如下视图

触发器在Oracle数据库中的应用

触发器在Oracle数据库中的应用

触发器在Oracle数据库中的应用实验内容1、创建触发器的方法和步骤。

语法如下:creat [ or replace ] trigger 触发器名触发时间触发事件on { table_or_view_name | database }[ referencing [ old [ as ] <old> ] [ new [ as ] <new> ][ for each row [ when condition ] ]trigger_body其中:触发器名:触发器对象的名称。

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

触发时间:指明触发器何时执行,该值可取:before 表示在数据库动作之前触发器执行;after 表示在数据库动作之后出发器执行;instead of 触发器被触发,但相应的操作并不被执行,而运行的仅是触发器SQL语句本身。

触发事件:指明哪些数据库动作会触发此触发器:insert 数据库插入会触发此触发器;update 数据库修改会触发此触发器;delete 数据库删除会触发此触发器;create 当使用create语句为创建一个数据库对象时触发触发器;alter 当使用alter语句为更改一个数据库对象时触发触发器;drop 当使用drop语句删除一个数据库对象时触发触发器;start 打开数据库时触发触发器,在事件后触发;shutdown 关闭数据库时触发,事件前触发;logon 当一个会话建立时触发,事件前触发;logoff 当关闭会话时触发,事件前触发;server 服务器错误发生时触发触发器,事件后触发。

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

数据库名暂不考虑。

for each row选项决定了触发器是行级触发器还是语句级触发器。

如果说明了for each row,那么对触发语句所影响表的每一行,触发器都触发一次。

缺少for each row选项则代表对于每一个可应用语句,触发器只触发一次,而不是针对每一个语句所影响的行各触发一次。

Oracle触发器操作

Oracle触发器操作
2020/10/15 Or acle 数 据库 管理 与 应用 实例 教 程
9.1 触发器概述
:OLD变量和:NEW变量
在Oracle系统中,每个触发器被DML操作触发时,会产生两个特殊的变 量:OLD和:NEW,分别代表某数据记录行在修改前和修改后的值。这两 个变量都是系统变量,由Oracle系统管理,存储在内存中,不允许用户 直接对其进行修改。:OLD和:NEW变量的结构总是与执行DML操作的表 的结构相同。当触发器工作完成以后,这两个变量也随之消失。这两个 变量的值是只读的,即用户不能向这两个变量写入内容,但可以引用变 量中的数据。 :OLD变量用于存储DELETE和UPDATE操作所影响的行的副本。当执 行DELETE或UPDATE操作时,行从触发表中被删除,并传输到:OLD 变量中。 :NEW变量用于存储INSERT和UPDATE操作所影响的行的副本。当执行 INSERT或UPDATE操作时,新行被同时添加到:NEW变量和触发表 中,:NEW变量中的行即为触发表中新行的副本。
建议课时:8课时
2020/10/15 Or acle 数 据库 管理 与 应用 实例 教 程
9.1 触发器概述
触发器简介 触发器是一种特殊的存储过程,它与数据表紧密联系,用于保护表中的 数据,当一个定义了特定类型触发器的基表执行插入、修改或删除表中 数据的操作时,将自动触发触发器中定义的操作,以实现数据的一致性 和完整性。 触发器拥有比数据库本身标准的功能更精细和更复杂的数据控制能力。 触发器具有以下的作用: (1)在安全性方面,触发器可以基于数据库的值使用户具有操作数据 库的某种权利。 (2)在审计方面,触发器可以跟踪用户对数据库的操作。 (3)实现复杂的数据完整性规则。 (4)实现复杂的非标准的数据库相关完整性规则。触发器可以对数据 库中相关的表进行连环更新。 (5)同步实时地复制表中的数据。 (6)自动计算数据值,如果数据的值达到了一定的要求,则进行特定 的处理。例如,如果商品的数量低于5,则立即给管理人员发送库存报 警信息。

oracle触发器

oracle触发器

Oracle 触发器<六> 触发器<2>、ORACLE端语法说明1、语法:CREA TE [OR REPLACE] TRIGGER trigger_name{ BEFORE | AFTER } triggering_event ON table_name[ FOR EACH ROW ][ WHEN trigger_condition ]trigger_body ;2、使用说明与示例:(1)、上语法中,trigger_event 是对应于DML的三条语句INSERT、UPDA TE、DELETE;table_name是与触发器相关的表名称;FOR EACH ROW是可选子句,当使用时,对每条相应行将引起触发器触发;condition是可选的ORACLE BOOLEAN条件,当条件为真时触发器触发;trigger_body是触发器触发时执行的PL/SQL块。

(2)、ORACLE触发器有以下两类:1> 语句级(Statement-level)触发器,在CREA TE TRIGGER语句中不包含FOR EACH ROW子句。

语句级触发器对于触发事件只能触发一次,而且不能访问受触发器影响的每一行的列值。

一般用语句级触发器处理有关引起触发器触发的SQL语句的信息——例如,由谁来执行和什么时间执行。

2> 行级(Row-level)触发器,在CREA TE TRIGGER语句中包含FOR EACH ROW子句。

行级触发器可对受触发器影响的每一行触发,并且能够访问原列值和通过SQL语句处理的新列值。

行级触发器的典型应用是当需要知道行的列值时,执行一条事务规则。

(3)在触发器体内,行级触发器可以引用触发器触发时已存在的行的列值,这些值倚赖于引起触发器触发的SQL语句。

1> 对于INSERT语句,要被插入的数值包含在new.column_name,这里的column_name 是表中的一列。

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触发器语法及实例1、触发器语法CREATE [OR REPLACE] TIGGER 触发器名[before|after] --触发时间[insert|update|delete] --触发事件ON 表名[FOR EACH ROW]BEGINpl/sql语句END;其中:触发器名:触发器对象的名称。

由于触发器是数据库⾃动执⾏的,因此该名称只是⼀个名称,没有实质的⽤途。

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

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

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

for each row:对表的每⼀⾏触发器执⾏⼀次。

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

2、触发器实例:(使⽤触发器实现序号⾃增)创建⼀个测试表:create table tab_user(id number(11) primary key,username varchar(50),password varchar(50));创建⼀个序列:create sequence MY_SEQ increment by 1 start with 1 nomaxvalue nocycle cache 20;创建⼀个触发器:create or replace trigger MY_TGRbefore insert on tab_user for each rowdeclarenext_id number;beginselect MY_SEQ.nextval into next_id from dual;:new.id:=next_id;end;向表插⼊数据;insert into tab_user(username,password) values('admin','admin');insert into tab_user(username,password) values('fgz','fgz');insert into tab_user(username,password) values('test','test');查询表结果:。

Oracle触发器基础教程

Oracle触发器基础教程

Oracle触发器基础教程Oracle触发器是一种特殊的数据库对象,它是一段由PL/SQL或Java编写的代码,当指定的条件满足时,会自动地在数据库中执行。

Oracle触发器可以在插入、更新或删除数据时触发一系列的动作,从而实现对数据的自动控制和处理。

一、创建触发器在Oracle中,使用CREATE TRIGGER语句可以创建触发器。

语法如下:CREATE [OR REPLACE] TRIGGER trigger_name{BEFORE,AFTER,INSTEADOF}{INSERT,UPDATE,DELETE}[OR {INSERT , UPDATE , DELETE} OF column_name][ON table_name][REFERENCING OLD AS old NEW AS new][FOREACH{ROW,STATEMENT}][WHEN (condition)][DECLARE]--声明变量和游标BEGIN--触发器代码--新增、修改或删除数据的动作END;trigger_name:触发器的名称,必须唯一BEFORE、AFTER、INSTEADOF:触发器执行的时间,BEFORE表示在数据操作之前执行,AFTER表示在数据操作之后执行。

INSERT、UPDATE、DELETE:触发器执行的操作类型,可以是插入、更新或删除。

column_name:触发器监听的列名。

table_name:触发器所在的表名。

REFERENCING:指定触发器中使用的旧值和新值的别名,可以在触发器代码中使用。

FOREACH:指定触发器是对每一行执行还是每条语句执行。

WHEN:指定触发器执行的条件。

二、触发器的类型1.行级触发器(FOREACHROW)行级触发器是对每一行进行操作的触发器,它会在每一行插入、更新或删除之后触发。

这种触发器常用于数据的验证和约束条件的实现。

2.语句级触发器(FOREACHSTATEMENT)语句级触发器是对每条语句进行操作的触发器,它会在数据操作语句执行完成后触发。

oracle触发器

oracle触发器

1、触发器的概述如果希望该子程序能够自动执行,就需要将该程序定义为触发器,触发器可以看做是一种特殊的存储过程,它可以在数据库相关事件(如DELETE、UPDATE,INSERT,CREATe等)发生时自动执行,常用于管理复杂的完整性约束或监控对表的修改操作。

触发器执行的机制与Java中的事件监听机制类似,当出现特定的事件时就会自动调用,Oracle数据库中的事件包括增加数据、修改数据、删除数据等。

与Java中的事件处理机制类似,在创建触发器时也需要指定触发器执行的事件2、触发器的语法(1)TRIGGER:用于创建触发器的关键字,就类似于创建存储过程的procedure和创建自定义函数的function一样。

(2)trigger_name:指定触发器的名称。

(3)BEFORE | AFTER | INSTEAD OF:指定触发器的时间,BEFORE表示在触发器在事件发生之前被执行,AFTER表示触发器在事件发生之后执行,INSTEAD OF指定该触发器为代替触发器。

(4)trigger_event:指定触发器的触发事件,常用的事件有INSERT、UPDATE、DELETE、CREATE、DROP等,多个事件之间需要使用or关键字进行连接。

(5)ON obj_name指定发生事件的数据库对象名称,如表名称、视图名称等。

如果执行的是DDL操作就必须写为ON DATABASE。

(6)FOR EACH ROW:表示该触发器为行级触发器,如果不指定该语句就默认为语句级触发器。

(7)WHEN tri_condition:指定触发器执行的条件,例如使用update语句修改的数据满足某个条件时才执行触发器的内容。

3、触发器的分类Oracle数据库的触发器事件相对于其他数据库而言相对复杂,根据触发器触发事件和触发器执行情况可以将Oracle中的触发器分为5种类型,具体如下所示。

(1)行级触发器:对表执行DML操作时,每影响一行数据,该类型的触发器就会执行一次。

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 教程 第9章 触发器

oracle 教程 第9章 触发器
ORACLE 9i
第9章 触发器
ORACLE 9i
IF INSERTING THEN INSERT INTO logs VALUES(logs_id_squ.NEXTVAL,'EMP','INSERT',: new.empno,SYSDATE,USER); ELSIF DELETING THEN INSERT INTO logs VALUES(logs_id_squ.NEXTVAL,'EMP','DELETE',: old.empno,SYSDATE,USER); ELSE INSERT INTO logs VALUES(logs_id_squ.NEXTVAL,'EMP','UPDATE',: new.empno,SYSDATE,USER); END IF; END;
DDL 事件(3 种)
数据库事件(5 种)
ORACLE 9i
第9章 触发器
ORACLE 9i
触发器的类型可划分为4种:数据操纵语言(DML) 触发器、替代(INSTEAD OF)触发器、数据定义语言 (DDL)触发器和数据库事件触发器。 各类触发器的作用如表9-2所示。
ORACLE 9i
第9章 触发器
ORACLE 9i
第9章 触发器
ORACLE 9i
在创建触发器之前,需要先创建事件记录表LOGS, 该表用来对操作进行记录。该表的字段含义解释如下: LOG_ID:操作记录的编号,数值型,它是该表的 主键,由序列自动生成。 LOG_TABLE:进行操作的表名,字符型,非空, 该表设计成可以由多个触发器共享使用。比如我们可以 为dept表创建类似的触发器,同样将操作记录到该表。 LOG_DML:操作的动作,即INSERT、DELETE或 UPDATE三种之一。

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命名规范

1、编写目的使用统一的命名和编码规范,使数据库命名及编码风格标准化,以便于阅读、理解和继承。

2、适用范围本规范适用于公司范围内所有以ORACLE作为后台数据库的应用系统和项目开发工作。

3、对象命名规范3.1 数据库和SID数据库名定义为系统名+模块名Ø全局数据库名和例程SID名要求一致Ø因SID名只能包含字符和数字,所以全局数据库名和SID名中不能含有“_”等字符3.2 表相关3.2.1 表空间Ø面向用户的专用数据表空间以用户名+_+data命名,如Aud用户专用数据表空间可命名为Aud_dataØ面向用户的专用索引表空间以用户名+_+idx命名Ø面向用户的专用临时表空间以用户名+_+tmp命名Ø面向用户的专用回滚段表空间以用户名+_+rbs命名Ø面向应用的表空间以应用名+_data/应用名+_idx/应用名+_tmp/应用名+_rbs命名ØLOB段数据专用表空间以其数据表空间+_+lobs命名,如上例中数据表空间为Aud_data,则LOB段表空间可命名为Aud_data_lobs3.2.2 表空间文件表空间文件命名以表空间名+两位数序号(序号从01开始)组成,如Aud_data01等3.2.3 表表命名要遵循以下原则:Ø一般表采用“系统名+t_+模块名+_+表义名”格式构成Ø若数据库中只含有单个模块,命名可采用“系统名+t_+表义名”格式构成Ø模块名或表义名均以其汉语拼音的首字符命名,表义名中汉语拼音均采用小写,且字符间不加分割符;Ø表别名命名规则:取表义名的前3个字符加最后一个字符。

如果存在冲突,适当增加字符(如取表义名的前4个字符加最后一个字符等)Ø临时表采用“系统名+t_tmp_+表义名”格式构成Ø表的命名如dft_gy_cbap:系统名(电费df)+t_+模块名(高压gy)+_+表义名(抄表安排cbap)dft_cbbj: 系统名(电费df)+t_+表义名(抄表标记cbbj)dft_tmp_hj: 系统名(电费df)+tmp+表义名(合计hj)(此处为临时表)Ø关联表命名为Re_表A_表B,Re是Relative的缩写,表A和表B均采用其表义名或缩写形式。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3,触发器语法和功能 3
4,例一:行级触发器之一 4
5,例二:行级触发器之二 4
6,例三:INSTEAD OF触发器 6
7,例四:语句级触发器之一 8
8,例五:语句级触发器之二 9
9,例六:用包封装触发器代码 10
10,触发器命名规范 11
从触发器的功能上来看,可以分成3类:
? 重写列(仅限于before触发器)
? 采取行动(任何触发器)
? 拒绝事务(任何触发器)
“重写列”用于对表字段的校验,当插入值为空或者插入值不符合要求,则触发器用缺省值或另外的值代替,在多数情况下与字段的default属性相同。这种功能只能在行级before触发器中执行。“采取行动”针对当前事务的特点,对相关表进行操作,比如根据当前表插入的记录更新其他表,银行中的总帐和分户帐间的总分关系就可以通过这种触发器功能来维护。“拒绝事务”用在对数据的合法性检验上,当更新的数据不满足表或系统的一致性要求,则通过抛出异常的方式拒绝事务,在其上层的代码可以捕获这个异常并进行相应操作。
2,触发器示例
触发器代码类似存储过程,以PL/SQL脚本编写。下面是一个触发器的示例:
新建员工工资表salary
create table SALARY
(
EMPLOYEE_ID NUMBER, --员工ID
MONTH VARCHAR2(6), --工资月份
[FOR EACH ROW]为可选项,如果注明了FOR EACH ROW,则说明了该触发器是一个行级的触发器,DML语句处理每条记录都会执行触发器;否则是一个语句级的触发器,每个DML语句触发一次。
WHEN后跟的condition是触发器的响应条件,只对行级触发器有效,当操作的记录满足condition时,触发器才被执行,否则不执行。Condition中可以通过new对象和old对象(注意区别于前面的:new和:old,在代码中引用需要加上冒号)来引用操作的记录。
AMOUNT NUMBER --工资金额
)
创建与salary关联的触发器salary_trg_rai
1 Create or replace trigger salary_trg_rai
2 After insert on salary
IF :NEW.amount > v_maxsalary THEN
raise_application_error(-20000, '工资超限');
END IF;
END;
以上的例子引入了一个新的表employment,表中的maxsalary字段代表该员工每月所能分配的最高工资。下面的触发器根据插入或修改记录的employee_id,在employment表中查到该员工的每月最高工资,如果插入或修改后的amount超过这个值,则报错误。
其中:new对象表示了插入的记录,可以通过:new.column_name来引用记录的每个字段值
3,触发器语法和功能
触发器的语法如下
CREATE OR REPLACE TRIGGER trigger_name
<before | after | instead of> <insert | update | delete> ON table_name
(
EMPLOYEE_ID NUMBER, --员工ID
MAXSALARY NUMBER --工资上限
)
插入两条记录
Insert into employment values(1, 1000);
Insert into employment values(2, 2000);
3 For each row
4 declare
5 Begin
6 Dbms_output.put_line(‘员工ID:’ || :new.employee_id);
7 Dbms_output.put_line(‘工资月份:’ || :new.month);
1,触发器简介
触发器(Trigger)是数据库对象的一种,编码方式类似存储过程,与某张表(Table)相关联,当有DML语句对表进行操作时,可以引起触发器的执行,达到对插入记录一致性,正确性和规范性控制的目的。在当年C/S时代盛行的时候,由于客户端直接连接数据库,能保证数据库一致性的只有数据库本身,此时主键(Primary Key),外键(Foreign Key),约束(Constraint)和触发器成为必要的控制机制。而触发器的实现比较灵活,可编程性强,自然成为了最流行的控制机制。到了B/S时代,发展成4层架构,客户端不再能直接访问数据库,只有中间件才可以访问数据库。要控制数据库的一致性,既可以在中间件里控制,也可以在数据库端控制。很多的青睐Java的开发者,随之将数据库当成一个黑盒,把大多数的数据控制工作放在了Servlet中执行。这样做,不需要了解太多的数据库知识,也减少了数据库编程的复杂性,但同时增加了Servlet编程的工作量。从架构设计来看,中间件的功能是检查业务正确性和执行业务逻辑,如果把数据的一致性检查放到中间件去做,需要在所有涉及到数据写入的地方进行数据一致性检查。由于数据库访问相对于中间件来说是远程调用,要编写统一的数据一致性检查代码并非易事,一般采用在多个地方的增加类似的检查步骤。一旦一致性检查过程发生调整,势必导致多个地方的修改,不仅增加工作量,而且无法保证每个检查步骤的正确性。触发器的应用,应该放在关键的,多方发起的,高频访问的数据表上,过多使用触发器,会增加数据库负担,降低数据库性能。而放弃使用触发器,则会导致系统架构设计上的问题,影响系统的稳定性。
8 Dbms_output.put_line(‘工资:’ || :new.amount);
9 Dbms_output.put_line(‘触发器已被执行’);
10 End;
打开一个SQL Window窗口(使用PL/SQL Developer工具),或在sqlplus中输入:
CREATE OR REPLACE TRIGGER salary_raiu
AFTER INSERT OR UPDATE OF amount ON salary
FOR EACH ROW
WHEN ( NEW.amount >= 1000 AND (old.amount IS NULL OR OLD.amount <= 500))
DECLARE
v_maxsalary NUMBER;
BEGIN
SELECT maxsalary
INTO v_maxsalary
FROM employment
WHERE employee_id = :NEW.employee_id;
FOR EACH ROW
BEGIN
IF inserting THEN
dbms_output.put_line(‘插入’);
ELSIF updating THEN
dbms_output.put_line(‘更新amount列’);
代码中的when子句表明了该触发器只针对修改或插入后的amount值超过1000,而修改前的amount值小于500的记录。New对象和old对象分别表示了操作前和操作后的记录对象。对于insert操作,由于当前操作记录无历史对象,所以old对象中所有属性是null;对于delete操作,由于当前操作记录没有更新对象,所以new对象中所有属性也是null。但在这两种情况下,并不影响old和new对象的引用和在触发器主体中的使用,和普通的空值作同样的处理。
触发器代码可以包括三种类型:未涉及数据库事务代码,涉及关联表(上文语法中的table_name)数据库事务代码,涉及除关联表之外数据库事务代码。其中第一种类型代码只对数据进行简单运算和判断,没有DML语句,这种类型代码可以在所有的触发器中执行。第二种类型代码涉及到对关联表的数据操作,比如查询关联表的总记录数或者往关联表中插入一条记录,该类型代码只能在语句级触发器中使用,如果在行级触发器中使用,将会报ORA-04091错误。第三种类型代码涉及到除关联表之外的数据库事务,这种代码可以在所有触发器中使用。
第三行说明了这是一个针对行级的触发器,当插入的记录有n条时,在每一条插入操作时都会执行该触发器,总共执行n次。
Declare后面跟的是本地变量定义部分,如果没有本地变量定义,此部分可以为空
Begin和end括起来的代码,是触发器的执行部分,一般会对插入记录进行一致性检查,在本例中打印了插入的记录和“触发器已执行”。
Insert into salary(employee_id, month, amount) values(1, ‘200606’, 10000);
执行后可以在sqlplus中,或在SQL Window窗口的Output中见到
员工ID:1
工资月份:200606
工资:10000
END IF;
END;
以上是一个after insert和after update的行级触发器。在第二行中of amount on salary的意思是只有当amount列被更新时,update触发器才会有效。所以,以下语句将不会执行触发器:
Update salary set month = ‘200601’ where month = ‘200606’;
[FOR EACH ROW]
WHEN (condition)
DECLARE
BEGIN
--触发器代码
END;
Trigger_name是触发器的名称。<before | after | instead of>可以选择before或者after或instead of。Before表示在DML语句实施前执行触发器,而after表示在在dml语句实施之后执行触发器,instead of触发器用在对视图的更新上。<insert | update | delete>可以选择一个或多个DML语句,如果选择多个,则用or分开,如:insert or update。Table_name是触发器关联的表名。
相关文档
最新文档