- 触发器在某个事件发生时自动地隐式运行。
- 一个表上最多有12个触发器,但同一时间、同一事件、同一类型的触发器只能有一个,并且各触 发器之间不能互相矛盾。
- 触发器过多会影响性能;
- 触发器最多为32kb,如果触发器需执行的操作较复杂,可定义存储过程,在触发器执行时调用该存储过程;
- 触发器可用于数据确认、安全检查、审计、数据备份和同步。
触发器的组成
触发事件:引起触发器被触发的事件,可以是DML、DDL、数据库系统事件(如系统启动或退出)、用户事件(用户的登录或退出);
触发时间:在事件发生前或发生后触发;
触发操作:触发器被触发后执行的操作;
触发对象:触发事件发生的对象,如表、视图、模式、数据库。
触发条件:由when子句指定一个逻辑表达式,只有当该表达式的值为true时,遇到触发器才会自动执行触发器;
触发频率:指定触发器内定义的动作被执行的次数,可分为语句级触发器和行级触发器,语句触发器指当触发事件发生时,该触发器只执行一次,行级触发器指当触发事件发生时,对受到该操作影响的每一行数据,触发器都单独执行一次。
创建DML触发器语法
create or replace trigger tri_name {befor|after} {insert|delete|update[of column[,column...]]} [or{insert|update|delete[ofcolumn[,column...]]}...] on [schema.]{table_name|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:指定触发方式为事件发生前或发生后触发;
insert/update/delete:指定在哪种事件发生时触发;
referencing:将old、new重命名,如 old as origin,则:original表示操作前的值;
:old/:new:DML操作前后的值,如:old.id表示操作执行前的id值;
when:触发器触发的条件,后接一个逻辑表达式,在逻辑表达式中使用old是不需要加冒号;只能用于行触发器;
instead of 触发器用于对视图的DML触发器,并且只能用于行级触发器,也不能使用when语句;
系统类触发器
在DDL或数据库系统事件上被触发,如create等,以及用户的登录与退出;该类触发器建立在schema或database上;
语法:
create or replace trigger [schema.]trigger_name [brfore|after] {ddl_event_list|database_event_list} on {database|[schema.]schema} [when condition] pl/sql_block|call procedure_name;
说明:
ddl_event_lisr:一个或多个数据库事件,事件间用or分开;
database_event_list:一个或多个数据库事件,事件间用or分开;
系统类的触发器事件说明:
startup:启动数据库实例之后触发
shutdown:关闭数据库实例前触发
servererror:数据库服务发生错误
logon:成功登陆到数据库触发
logoff:断开数据库之前触发
create:执行create语句创建数据库对象之前或之后触发
drop:删除数据库对象时触发
alter:修改对象时触发
ddl:执行ddl语句时触发
grant:执行grant语句时触发
revoke:执行revoke语句时触发
rename:rename语句对修改数据库对象名称时触发
audit/noaudit:执行audit或noaudit进行审计或停止审计时触发
系统级事件触发时包含相应的属性,可通过Oracle定义的事件属性函数来读取
ora_sysevent:激活触发器事件
instance_num:数据库实例名
Ora_database_name:数据库名称
server_error(posi):错误信息栈中posi指定位置中的错误号
is_servererror(error_number):检查err_number指定的错误号是否在错误信息栈中,如果在则返回true,否则返回false。再触发器内调用此函数可以判断是否发生指定的错误。
login_user:登录或注销的用户名称;
dictionary_obj_type:ddl语句所操作的数据库对象类型
dictionary_obj_name:ddl语句所操作的数据库对象名称
dictionary_obj_owner:ddl语句所操作的数据库对象所有者的名称
des_encrypted_password:正在创建或修改的经过des算法加密的用户口令
触发器谓词
inserting:如果触发器是insert语句,则为true,否则为false
updating:如果触发器是update语句,则为true
deleting:触发器是delete为true