Oracle触发器

  • 触发器在某个事件发生时自动地隐式运行。
  • 一个表上最多有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
posted @ 2018-05-29 20:13  waynelo  阅读(243)  评论(0编辑  收藏  举报