• Oracle 之 触发器


      触发器是特定的事件出现的时候,自动隐式执行代码块,这个过程用户无法控制,用户只能控制触发的事件,触发后的操作,触发过程是自动执行的。

    定义触发器:

      1、名称

      2、触发时间:是在执行事件之前(before)触发,还是之后(after)触发

      3、事件:insert(插入)、delete(删除)、update(更新)

      4、作用目标:on table_name

      5、引用的值:old(旧值)、new(新值)

      6、作用域:for each row(行级)或 无此行表示语句级

      7、约束条件:可选,where 约束条件,不能包含查询语句,也不能调用PL/SQL函数

      8、主体语句:begin ...

      示例:create or replace trigger biufer_employess_emp_id

           before insert or update of emp_id on employees

          referencing old as old_value new as new_value

          for each row

          when (new_value.emp_id =9)

          begin

           :new_value.age :=26;

         end biufer_employess_emp_id;

       当执行下面SQL语句时触发器被触发:

       INSERT INTO employees(emp_id,emp_name,position,age,address)
             VALUES(9,'周迅','开发工程师',NULL,'南京路99号');

       触发器自动执行,不会通知用户,再次查看employees表时:

        9 周迅 开发工程师 26 南京路99号 

       但此时触发器不会提交,触发器里也不能使用commit/rollback/DDL语句,只能由用户提交(或其他程序)

    触发器类型

     1、语句触发器

      在表上或者某些情况下的视图上执行的特定语句或者语句组的触发器。能够与insert、delete、update或者组合上进行关联。但无论使用什么样的组合,各个语句触发器都只会针对指定语句激活一次。比如,无论update多少行,也只会调用一次update语句触发器。

      示例:需要对表进行DML的用户进行安全检查,看是否具有合适的特权。

      create table foo(a number);

      create trigger biud_foo

       before insert or update or delete on foo

       begin

        if user not in ('donny') then

        raise_application_error(-20001,'You don"t have access to modify this table. ');

        end if;

       end;  //即使sys,system用户也不能修改foo表

     2、行触发器

      是指为受到影响的各个行激活的触发器。

      示例:为主键生成自增序列号

      create table foo(id number,data varchar2(20));

      create sequence foo_seq;

      create or replace trigger bifer_foo_pk

      before insert on foo

      for eache row

      begin

       select foo_seq.nextval into :new.id from dual;

      end

      SQL语句

      insert into foo(data) values('donny');//自动添加id值

      insert into foo values(5,'chen');  //插入该行5会被替换成foo_seq.nextval生成的值

      select *from foo;

     3、instead of 触发器

      create or replace view company_name as select emp_id,emp_name,position,age,address from scctt.employess;

      update company_name set emp_name = 'tom' where emp_id = 13;

      create or replace trigger update_name_company_name

        instead of update on company_name

      begin

        update employess set emp_id := :new.emp_id,

        emp_name := :new.emp_name,

        where employess_id = :old.emp_id;

      end;  

     4、系统条件触发器

      系统事件:数据库启动、关闭,服务器错误

      create trigger ad_startup  after startup on database

      begin

      ---do some stuff

      end;

     5、用户事件触发器 

      用户事件:用户登录、注销,create/alter/drop/analyze/audit/grant/revoke/rename/trancate/logoff

       示例:记录删除对象

      create table drop_object(obj_name varchar2(30),obj_type varchar2(30),dropped_on date);  //日志表

      create or replace trigger log_drop_trigger  // 触发器

      before drop on donny.schema

      begin

      insert into drop_object values(ora_dict_obj_name,ora_dict_type,sysdate);

      end;

      SQL语句:

      create table drop_me(a number);

      create view drop_me_view as select *from drop_me;

      drop view drop_me_view;

      drop table drop_me;

      select *from droped_objects

      禁用和启用触发器 
        alter trigger <trigger_name> disable; 
        alter trigger <trigger_name> enable;

      触发器的作用

        1、允许/限制对表的修改

        2、自动生成派生列,比如自增字段。

        3、强制数据一致性。

        4、提供审计和日志记录

        5、防止无效的事务处理

        6、启用复杂的业务逻辑

          

  • 相关阅读:
    oracle 存储过程 游标
    SQL DateTime查询与格式
    Oracle 中的 TO_DATE 和 TO_CHAR 函数 日期处理
    C#命名规范
    (转)javascript——各种网页常用小技巧
    (转)WEB免费打印控件推荐
    JS倒计时代码
    使用重写 ajax 用的一些基础东西
    (转)动态加载CSS
    (转)用Javascript获取页面元素的位置
  • 原文地址:https://www.cnblogs.com/manliu/p/4072372.html
Copyright © 2020-2023  润新知