《硅谷》杂志:ORACLE触发器的技术研究 |
2013-03-02 13:48 作者:朱 伟 来源:硅谷网-《硅谷》杂志 HV: 编辑: 【搜索试试】
|
|
硅谷网文 据《硅谷》杂志2012年第22期刊文称,介绍DML触发器、替代触发器和系统触发器,它们是存储在数据库里的特殊存储过程。当表、视图发生改变或发生特定用户事件、系统事件时将隐式激发定义在其上的触发器,数据库将自动执行触发器。触发器能被作为数据库内置审计功能的有益补充用于审计。
关键词:DML触发器;替代触发器;系统触发器
0引言
目前企业的计算机应用系统多数都是基于数据库的,在使用这些应用系统的时候,不可避免的要遇到一些数据库中有关数据完整性、批量删除和审计方面的问题。在这方面触发器能很好的实现复杂的数据完整性检查和约束,拒绝或回退那些破坏相关完整性的变化;审计用户操作数据库的语句。本文就是对Oracle触发器技术进行的介绍。
1Oracle触发器的概念和类型
数据库触发器是响应插入、更新或删除等数据库事件而执行的过程,它定义了当一些数据库相关事件发生时应采取的动作。有三种主要的触发器类型:DML触发器、替代触发器和系统触发器。
1.1DML触发器
DML触发器就是对表或视图执行DML操作时激发的触发器,并且由该语句的类型决定DML触发器的类型。它是一个与特定表相关联的存储过程,也就是说一个DML触发器仅与一个表相关联,但一个表可以对应多个DML触发器。DML触发器分为行触发器和语句触发器,触发事件包括insert、update和delete,触发的时间可以在DML语句之前或之后。
1.2替代触发器
替代触发器只能定义在视图上而不能定义在表上,它由视图的DML事件激发而非DDL或数据库系统事件激发,它执行一个替代操作来代替触发语句的操作。与DML触发器不同,DML触发器是在DML操作之外运行的,而替代触发器则代替激发它的DML语句运行。替代触发器是行一级的。在替代触发器中只能读取:old和:new的值,而不能修改:old和:new。
1.3系统触发器
系统触发器在发生实例启动或关闭、用户登录或退出数据库和数据库发生错误这些事件时激发,而不是在执行DML语句时激发。系统触发器也可以在DDL操作时,如表的创建中激发。
2运用Oracle触发器
在创建触发器时触发器主体不能超过32K。如果触发器长度超过了该限制,就要把该体内的某些代码放到单独编译的包或存储子程序中,并从触发器主体中调用这些代码。
2.1运用DML触发器
DML触发器可以由给定表中的一个以上的DML语句激发。触发器中的任何代码将随触发语句一起作为同一事务的一部分运行。
2.1.1DML触发器激发顺序
DML触发器是在DML语句运行时激发的,下面是执行DML语句的顺序步骤:
1)如果有语句之前级触发器的话,先运行该触发器。
2)对触发语句所影响的每个数据行循环执行以下操作:
①如果有行之前级触发器的话,运行该触发器;
②执行该语句本身,对数据行加锁并进行修改,之后执行完整性约束检查(锁直至事务提交时才被释放);
③如果有行之后级触发器的话,运行该触发器。
3)执行延迟的完整性约束检查。
4)如果有语句之后级触发器的话,运行该触发器。
当每个触发器被激发时,该触发器将可以看到由其前期触发器实现的变更,以及到目前为止由DML语句对数据实现的变更。不同类型的触发器间存在固定的触发顺序,但同类触发器的激发顺序没有明确的定义,如果顺序非常重要的话,可以把所有的操作组合在一个触发器中。
2.1.2行级触发器的相关标识
在行级触发器内部,可以访问正在处理中的行数据。这种访问是通过两个相关的标识符:old和:new实现的。pl/sql编译器将把这种变量按记录类型trigger_table%ROWTYPE处理,其中,trigger_table是定义触发器所在的表。:new和:old不能按全记录赋值,而只能用:new.field或:old.field对其内部的字段分别进行赋值。除此之外,:new和:old记录不能传递到接收trigger_table%ROWTYPE的过程或函数中。标识符:old对insert语句无定义,而标识符:new对delete语句无定义,pl/sql编译器编译的结果将使该所有字段为空。
2.2运用替代触发器
可以对视图执行普通的DML语句,并定义替代触发器修改相关的底层表。视图中每个被修改的数据行都将触发替代触发器运行一次,Oracle只运行触发操作而不运行触发语句。对于不可修改的视图和需要在插入、更新或删除前验证相关数据值的需求,可以通过替代触发器实现。用户可以在触发器代码中验证将要被修改的数据是否有效,验证正确后才将修改应用到相关的底层表中。用户不能直接使用table子句修改视图中嵌套表列内的元素,但此需求可以通过在嵌套表上定义替代触发器来实现。如果插入、更新或删除了视图内的嵌套表元素,嵌套表的触发器将被触发,对嵌套表执行实际的修改。
2.3运用系统触发器
系统触发器可以在数据库级或模式级定义,关键字database和schema决定了给定系统触发器的等级。如果没有用关键字schema来说明模式,则以触发器所属的模式为默认模式。数据库级的触发器不管触发事件何时发生都将激活。startup和shutdown触发器只与数据库级有关,虽然在模式级创建它们是合法的,但它们不会被激活。
系统触发器的事务特性与触发事件有关。系统触发器可以作为基于触发器正常结束时提交的独立事务激活,也可以作为当前用户事务的一部分激活。触发器startup、shutdown、severerror和logon都是由独立事务激活的,而logoff和ddl触发器则作为当前事务的一部分被激活。
3Oracle触发器注意事项
①触发器(除了自主触发器)不能发布任何事务控制语句,由触发器体调用的任何过程或函数都不能发布任何事务控制命令。
②由于触发器是已经编译的对象,因此所有权限都必须直接授权,而不能通过角色授权。
③触发器体中的SQL语句不能进行下列操作:
读或修改触发语句的任何变异表,其中包括触发表本身;
读或修改触发表的约束表中的主关键字,唯一关键字和外部关键字列,除此之外的其他列可以修改。
该限制适用于所有的行级触发器,这些限制只在语句触发器作为deletecascade操作的结果激活时适用于语句触发器。如果insert语句只影响一行的话,则在该行的之前和之后触发器将不把触发表作为变异表对待。语句INSERTINTOtableSELECT...总是把触发表作为变异表对待,即使其子查询仅返回一行也是如此。
④当触发器被触发执行时,触发操作所引用的表可能在同时被其他用户事务的SQL语句修改。无论何种触发器,其中的SQL语句与普通SQL语句遵循完全相同的并发访问规则。例如,如果触发操作需要读(查询)或写(更新)被未提交事务修改的数据时,那么触发操作内的SQL语句遵循以下规则:
查询操作访问的是被触发器所引用的表的当前读一致性视图,也可以访问到触发语句所在事务内被修改的任何数据;
更新操作必须等待已存在的数据锁。
⑤触发语句引起的所有触发操作及完整性检查必须全部成功执行。如果某个触发操作中出现异常,且此异常没有被显式地处理,那么触发语句执行的所有操作及相关触发器执行的所有操作都会被回滚。需要注意,触发操作也不能违反完整性约束。完整性约束在触发器执行模式中同样有效,因此违反完整性约束的触发操作无法成功执行。
4结束语
本文对Oracle触发器的类型、使用和注意事项作了较为详尽的阐述,为使用Oracle触发器的用户提供了一些可以借鉴的知识点,从而可以更好的帮助其实现数据完整性检查和审计方面的工作。
作者简介:
朱伟(1981-),男,皖淮北人,大学本科,计算机科学与技术专业,工程师,从事数据安全,软件开发及维护工作。
|
|
|
|
【对“《硅谷》杂志:ORACLE触发器的技术研究”发布评论】 |
版权及免责声明:
① 本网站部分投稿来源于“网友”,涉及投资、理财、消费等内容,请亲们反复甄别,切勿轻信。本网站部分由赞助商提供的内容属于【广告】性质,仅供阅读,不构成具体实施建议,请谨慎对待。据此操作,风险自担。
② 内容来源注明“硅谷网”及其相关称谓的文字、图片和音视频,版权均属本网站所有,任何媒体、网站或个人需经本网站许可方可复制或转载,并在使用时必须注明来源【硅谷网】或对应来源,违者本网站将依法追究责任。
③ 注明来源为各大报纸、杂志、网站及其他媒体的文章,文章原作者享有著作权,本网站转载其他媒体稿件是为传播更多的信息,并不代表赞同其观点和对其真实性负责,本网站不承担此类稿件侵权行为的连带责任。
④ 本网站不对非自身发布内容的真实性、合法性、准确性作担保。若硅谷网因为自身和转载内容,涉及到侵权、违法等问题,请有关单位或个人速与本网站取得联系(联系电话:01057255600),我们将第一时间核实处理。
|
|
|
|