• Oracle触发器


    --触发器的分类
    1、数据库操作语言(DML)触发器。
    2、数据库定义语言(DDL)触发器。
    3、复合触发器。
    4、Instead of 触发器。此类触发器通常作用在视图上。对于多个源表的视图做DML操作
    通常是不被允许的,如果遇到这种情况就可以利用 instead of 类型触发器
    解决问题。利用它可以把对视图的DML操作转换成对多个源表进行操作。
    5、用户和系统事件触发器。
    
    --DML触发器的语法
    create [or replace] trigger trg_name
    {before | After | Instead Of}
    {Delete | insert | update [of column [,column]...]}
    [Or {delete | insert | update [of column [,column]...]}]
    {ON [table_name | View_name]}
    [for each row]
    [follows trigger ,trigger]
    [enable | disable]
    [when (condition)]
    trigger_body--触发器函数体
    
    before :触发器类型为前触发。
    after :触发器类型为后触发。
    instead of :表示触发器类型为替换类型。
    Delete | insert | update :表示触发的事件。
    [of column [,column] :触发器条件具体到某列。
    ON [table_name | View_name] :作用到表和视图
    [for each row] :表示行级触发器,省略这为语句级触发器。
    [follows trigger ,trigger] :触发器执行的顺序。
    [enable | disable] : 触发器是否有效。
    [when (condition)] :触发该触发器的条件。
    
    
    --DDL和数据库事件触发器语法
    create [or replace ] trigger trg_name
    {before | after}
    {ddl_event [or ddl_event]...
    | database_event [or database_event]...}
    on [Schema | database]
    [Follows trigger ,trigger...]
    [enable | disable]
    [when (condition)]
    trigger_body--触发器函数体
    
    {ddl_event [or ddl_event]... : DDL事件,使用Or链接。
    on [Schema | database] :作用在那个模式上或数据库上。
    
    --复合型触发器
    create [or replace] trigger trg_name
    {before | After | Instead Of}
    {Delete | insert | update [of column [,column]...]}
    [Or {delete | insert | update [of column [,column]...]}]
    {ON [table_name | View_name]}
    compound trigger 
    [before statement is trigger_body end before statement
    | before each row is trigger_body end before each row
    |after statement is trigger_body end after statement 
    |after each row is trigger_body end after each row
    ]
    
    compound trigger :复合型触发器关键字。
    before statement :前语句级触发。
    before each row :前行级触发。
    after statement :后语句级触发。
    after each row :后行级触发。
    
    
    --查看触发器
    select * from user_objects where object_type='TRIGGER';
    --查看触发器源码
    select * From user_source where name='触发器名称'  order by line;
    
    
    --触发器实例
    create trigger pric_test
    before  insert  of id on procduct
    for each row
      declare 
      v_proc_id number(10,2):=1;
      begin 
        
      insert into procduct (id,name) value (:NEW.ID,'小马');
      end;
      
      
    --instead of类型触发器是作用于视图的但直接操作与源表
    create view vw_procduct
    as 
    select id,name,age from procduct;
    
    create trigger instead_of_trg
    instead of insert  on vw_procduct
    declare
    v_id number(10,2);
    begin
         select id into v_id from procducttype where  code=:NEW.code;
         
         insert 
         into procduct 
         values (v_id,'花花',23);
         
     end;  
     
     
     --DDL类型触发器
     create trigger DDl_trg
     before create or alter or drop or rename on schema
     begin
     if SYSEVENT='create' then
       dbms_output.put_line(Dictionary_obj_name||'创建中...');
      elsif sysevent='drop' then
        if dictionary_obj_name='test' then
          raise_application_error(-2000,'不允许删除test表'); 
          end if;
          elsif sysevent='alter' then
           raise_application_error(-2000,'不允许修改test表');
           elsif sysevent='rename' then 
           raise_application_error(-2000,'不允许修改表名');
           end if;
           
           end;     
     --DDL常用事件
     sysevent :所有事件,返回激发触发器的事件名称。
     instance_num :所有事件,返回当前数据库的实例号。
     database_name :所有事件,返回当前数据库名。
     server_error :servererror 错误堆栈的指定位置返回错误号
     login_user :所有事件,返回激发触发器的用户名。
     dictionary_obj_type :createalterdrop 返回激活触发器的DDL操作的对象类型。
     dictionary_obj_name :createalterdrop 返回激活触发器的DDL操作对象的名称。
     
     --用户和系统事件触发器
     create table log_user(
     logonid varchar2(20),
     logonname varchar2(50),
     logontime date,
     constraint log_user_pk primary key (logonid)
     );
     
     create trigger logon_tgr
     after
     logon
     on database
     begin
       insert into log_user values(seq_logonid.nextval,sys.login_user,sysdate);
       
       end;
       
      --删除触发器
      drop trigger trg_name;
     
     
     
     
    
    
    
      
  • 相关阅读:
    二分和三分
    windows对拍及其应用
    RMQ与st表
    图论最短路
    图论最小生成树
    贪心问题
    [转载]图论500题
    第二次重建博客。。
    二分和三分题
    树状数组
  • 原文地址:https://www.cnblogs.com/gynbk/p/6556179.html
Copyright © 2020-2023  润新知