• 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
  • 相关阅读:
    spring中bean的生命周期
    【数据结构与算法】2.2 数组实现循环队列思路、代码
    【数据结构与算法】2.1、数组队列场景、思路、实现
    【Java 基础领域】手气红包实现思路、代码
    【数据结构与算法】1、稀疏数组场景、思路、代码实现
    【Java基础领域】 byte num = 100 没有强制类型转换,为什么也可以编译通过
    【程序人生】程序员发展的7大方向
    【读书笔记】老许的架构
    对于开发中为什么很少用设计模式的思考
    Java编程思想目录
  • 原文地址:https://www.cnblogs.com/waynelo/p/9107666.html
Copyright © 2020-2023  润新知