oracle:触发器,自治事务 trigger

本文详细介绍了Oracle触发器的使用方法,包括创建、格式、自治事务的应用以及触发器的常见格式。重点阐述了如何在插入数据时,通过触发器实现数据的自动更新和清理流程,特别强调了自治事务在确保数据完整性方面的重要作用。
create or replace trigger TRI_FC83_INSERT
  before insert ON FC83
  FOR EACH ROW
declare
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  :new.afc212 := '1';
  delete from fc83
   where afc001 = :new.afc001
     and afa031 = :new.afa031
     and afc210 = :new.afc210;
  commit;
END TRI_FC83_INSERT;

 

oracle在trigger自制事务,目的很简单,就是在插入数据的时候,先插入一条afc212(原值为0)的值为1的数据,然后把afc212=0的数据删除。

如下:中红色是为了解决问题而新加入的(即解决事务无法提交)

 

触发TRI_FC83_INSERT的sql如下

insert into fc83 (afc001, afa031, afc163, afc187, afc183, afc157, afc181, afa040, afc180, afa192, afa051, afa053, 
afc166, afc155, afc153, afc154, afa183, afa184, afa185, afa032, afa052, afa091, afc015, aaa010, afc210, afc211, 
afa501, afa503, aaa102, afc212, afc501)

select afc001, afa031, afc163, afc187, afc183, afc157, afc181, afa040, afc180, afa192, afa051, afa053, 
afc166, afc155, afc153, afc154, afa183, afa184, afa185, afa032, afa052, afa091, afc015, aaa010, afc210, afc211, 
afa501, afa503, aaa102, '1', afc501 from fc83 where afc001='000000079X';

*-*-*-*-**-*-*-*-**-*-*-*-**-*-*-*-**-*-*-*-**-*-*-*-**-*-*-*-**-*-*-*-**-*-*-*-**-*-*-*-**-*-*-*-**-*-*-*-*

触发器的格式:

 
CREATE [OR REPLACE ] TRIGGER trigger_name
{BEFORE| AFTER} {UPDATE| INSERT| DELETE|SELECT} ON table_name
[FOR EACH ROW] [FOLLOWS another_trigger]
[ENABLE| DISABLE]
[WHEN condition]
DECLARE
    xxxx;
BEGIN
    NULL;
[EXCEPTION]

END;
 

这是一般的触发器格式。

BEFORE|AFTER:选择触发器在 DML操作之前还是之后发生。

不知道触发器能不能够对 SELECT 起作用,应该可以的。

FOR EACH ROW:指定行触发器,只适用于UPDATE,INSERT,DELETE。

FOLLOWS,指定触发器的顺序,11g 以后使用的。

ENABLE|DISABLE:指定触发器启用还是禁用。(默认启动)

或者通过下列语句

ALTER TRIGGER trigger_name {ENABLE|DISABLE};

 

WHEN:指定执行触发器时必须要满足的条件。

一个表被删除,则定义在这表上的触发器也会被删除。

注意:

1.触发器也许不会执行事务控制语句,e.g.COMMIT、SAVEPOINT、ROLLBACK.当触发器执行是,所有执行的操作会称为事务的一部分。当事务被提交或滚回,触发器的才做也会提交或滚回。如果想跳出此规则可以通过 自治事务

2.触发器调用任何的函数或者过程也许不会执行事务控制语句。除非包含 自治事务

3.不允许在触发器中声明LONG 或者 LONG RAW 变量。

 

触发器中包含两个伪记录,分别为  :NEW 、 :OLD,使用时包括冒号,用于标识新的数据(INSERT时的)、旧的数据(delete时的)或者UPDATE则两者都有。逻辑上不存在时被设置为 NULL

这两者可以看做RECORD 使用。

 

触发器中提供布尔函数检查触发的是DML中何种状态,如下:

 
CREATE TRIGGER trigger_name 
AFTER UPDATE OR DELETE ON table_name
DECLARE
  v_type VARCHAR(20);
BEGIN
  IF UPDATING THEN
     v_type  := 'updating' ;
  ELSIF DELETING THEN
     v_type := 'deleting';
  END IF;
  xxxxxxx;
END;
 

 

 

自治事务:

    由其他事务(通常称为主事务)发起的独立事务。也就是说,自治事务也许会执行多个DML语句,并且提交或者滚回操作,而不会提交或者滚回主事务执行的DML语句。

 例子:

    有一个触发器,在table 执行UPDATE 之后被触发,以记录审计数据。假设你希望即使主事务失败,仍旧能够记录审计数据(即触发器操作仍然有效)。这样可以通过 自治事务实现。

 语法:

 
CREATE OR REPLACE TRIGGER trigger_name
AFTER UPDATE ON table_name
DECLARE
  xx;
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  xx;

  COMMIT;
END;
 

 

PRAGMA  AUTONOMOUS_TRANSACTION;  和 COMMMIT; 语句是必须的。

 

代替触发器(INSTEAD OF 触发器)

代替触发器定义于视图

CREATE OR REPLACE trigger_name
INSTEAD OF DELETE ON table_name
BEGIN
  xxxx;
END;

 

假如在一个视图上进行删除操作,但是有完整性约束,可以通过INSTEAD OF 触发器删除约束表的数据。

转载于:https://www.cnblogs.com/lowerCaseK/p/oracle_trigger.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值