文档介绍:触发器
触发器是一种特殊类型的存储过程,主要用于维护数据库中的表,它在插入、删除、修改某一特定表中的数据时触发执行,具有比数据库系统本身标准的功能更精细、更复杂的数据控制能力,能确保不同表中的相关记录的同步插入、删除和更新,保证数据的完整性。
11/10/2017 10:01 PM
触发器
触发器有以下作用:
(1)安全性
触发器可以利用数据库表中的值使用户具有操作数据库的某种权利,可以对用户操作数据的时间进行限制,也可以限制用户操作数据库中数据。如限制用户节假日不准修改数据,不允许股票价格涨幅超过10%等。
(2)审计
利用触发器可以跟踪用户对数据库中数据的操作,可以审计用户操作数据库的语句,也可以把用户对数据库的更新写入审计表。
11/10/2017 10:01 PM
触发器
(3)实现复杂的数据完整性规则。
利用触发器能实现非标准的数据完整性检查与约束,可产生比规则更复杂的限制。与数据库中表的约束不同,触发器可引用表的字段或数据库的其它对象。同时利用触发器可提供可变的缺省值。
11/10/2017 10:01 PM
触发器
(4)实现复杂的非标准的数据库的相关完整性规则。
利用触发器在对表中数据进行插入、删除、修改的同时可对相关的表进行连环更新,能同步实时复制表中的数据,能根据一些规则进行一些特定的处理操作。
11/10/2017 10:01 PM
触发器
建立触发器的语法为:
CREATE [OR REPLACE] TRIGGER trigger_name
Before|After|Instead of
Delete|insert|update [of column[,column]…]
[or Delete|insert|update [of column[,column]…]
…
ON table_name
[[REFERENCING old [as] old1|new [as] new1]
FOR EACH ROW|statement
[WHEN condition]
IS|AS
[declaration_statements]
BEGIN
Executable_statements
[EXCEPTION
exception-handler_statemebts]
END;
触发器
说明:(1)Before |After |Instead of中BEFORE或AFTER表示该触发器触发的时间,是在触发动作之前还是之后。如果一个视图涉及到两个或两个以上表时,可使用INSTEAD OF确定对视图的数据进行更新时,也对该视图所基于的表中的记录进行更新,利用INSTEAD OF时,“ON table_name”应变为“ON view_name”, INSTEAD OF只能在Oracle 8 以上版本中使用。
(2)Delete | insert | update [of column[,column]…]表示触发动作。
(3)FOR EACH ROW|statement表示触发器是行级触发器还是语句级触发器。对处理中的第一行,行级触发器都执行一次。语句触发器是对每个处理执行一次,若对某一表进行批量数据更新,则建立在此表上的语句级数据更新触发器当整批数据更新之前或之后触发一次。
(4)REFERENCING 子名表示当引用列的旧值或新值时,可以为它们指定名称,缺省时为“OLD”和“NEW”
11/10/2017 10:01 PM
触发器
(5)WHEN condition表示触发器执行的条件。
(6)declaration_statements为声明语句组,主要对该触发器中所使用的变量、游标等进行说明。如果没有任何声明,则在IS与BEGIN之间就没有语句。
(7)Executable_statements为可执行语句,在BEGIN之后和END或EXCEPTION之前必须是可执行语句。
(8)EXCEPTION exception-handler_statemebts为例外处理语句,具体如何使用,在前面已经进行了介绍。
(9)如果一个触发器已存在,可通过CREATE OR REPLACE TRIGGER来代替。
11/10/2017 10:01 PM
触发器
(10)在行级触发器中,SQL语句或PL/SQL语句可以通过用OLD和NEW来引用以前和新的字段的值,OLD定义参照字段以前的值,NEW定义参照字段新的值,利用OLD与NEW比用WHEN子句更复杂的条件来检测字段值的改变。当触发动作为INSERT时,所有字段的OLD值为NULL,NEW值为插入的数据。当触发动作为DELETE时,所有字段的OLD值将被删除,NEW值为NULL。