oracle触发器(整理内容来自网络)_Stream'S blog_百度空间

         触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,不能带参数,比如当对一个表进行操作( insert,delete, update)时就会xx它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。

      Oracle触发器语法

触发器是特定事件出现的时候,自动执行的代码块。类似于存储过程,触发器与存储过程的区别在于:存储过程是由用户或应用程序显式调用的,而触发器是不能被直接调用的。

功能:

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

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

3、 强制数据一致性

4、 提供审计和日志记录

5、 防止无效的事务处理

6、 启用复杂的业务逻辑

     触发器触发时间有两种:after和before。

1、触发器的语法:

CREATE [OR REPLACE] TIGGER触发器名 触发时间 触发事件

ON表名

[FOR EACH ROW]

BEGIN

pl/sql语句

END

其中:

触发器名:触发器对象的名称。

触发时间:指明触发器何时执行,该值可取:

before---表示在数据库动作之前触发器执行;

after---表示在数据库动作之后出发器执行。

触发事件:指明哪些数据库动作会触发此触发器:                        

insert:数据库插入会触发此触发器;

update:数据库修改会触发此触发器;

delete:数据库删除会触发此触发器。

表 名:数据库触发器所在的表。

for each row:对表的每一行触发器执行一次。如果没有这一选项,则只对整个表执行一次。


事务的特性:

事务具有ACID四大特性:

某种意义上说,原子性是手段,一致性是目的,通过原子性的手段达到一致性的目的。

A:原子性: 做都做 不做都不做-------手段

C:一致性: 做事务操作的前后,数据保持一致性-----目的

I: 隔离性: 隔离性越强,并发性越弱

                 ---------用for update 来实现事务的隔离性 通过锁的特性:

                                     |

                            是一个加锁过程

D:{yj}性:同一个事务在commit 之后不能rollback



oracle中 DML语言 发生时 oracle 只操作内存,并不能自动提交
行触发器的工作原理是 俩个重要的内存表

                   old                 new

insert          ----                    ok

update         ok                   ok

delete           ok                     ----

:new --为一个引用{zx1}的列值;
:old --为一个引用以前的列值; 这两个变量只有在使用了关键字 "FOR EACH ROW"时才存在.且update语句两个都有,而insert只有:new ,delect 只有:old;

实例


--drop trigger trig_account_spittor
create or replace trigger trig_account_spittor    
       after insert or update  
       of spittor_id,amount,status
       on spittor_account  
       for each row   
       begin
          if :new.status=1 then
           if inserting then
                update spittor set balance=(balance+:new.amount) where id=:new.spittor_id;
           end if;
          end if;
          commit;
       end;

--drop trigger trig_spittor_order
create or replace trigger trig_spittor_order    
       after insert or update   
       of id,spittor_id,name,total_price,type,status
       on spittor_order    
       for each row   
       begin
          if :new.status=1 then
           if inserting then
              if :new.type=1 then
                 insert into spittor_account(id,order_id,spittor_id,amount,fiinsh_date,status)values(seq_spittoraccount.nextval,:new.id,:new.spittor_id,:new.total_price,sysdate,:new.status);
              elsif :new.type=2 then
                  insert into spittor_account(id,order_id,spittor_id,amount,fiinsh_date,status)values(seq_spittoraccount.nextval,:new.id,:new.spittor_id,-:new.total_price,sysdate,:new.status);
              end if;
           elsif updating then
               if :old.status=1 then
                  dbms_output.put_line('warning:this order is also done it....');
               else
                   if :new.type=1 then
                      insert into spittor_account(id,order_id,spittor_id,amount,fiinsh_date,status)values(seq_spittoraccount.nextval,:new.id,:new.spittor_id,:new.total_price,sysdate,:new.status);
                  elsif :new.type=2 then
                      insert into spittor_account(id,order_id,spittor_id,amount,fiinsh_date,status)values(seq_spittoraccount.nextval,:new.id,:new.spittor_id,-:new.total_price,sysdate,:new.status);
                  end if;                  
               end if;
           end if;
          end if;
       end;


            



郑重声明:资讯 【oracle触发器(整理内容来自网络)_Stream'S blog_百度空间】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——