zoukankan      html  css  js  c++  java
  • oracle:触发器,自治事务,instead of trigger,trigger

    触发器的格式:

    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 触发器删除约束表的数据。

  • 相关阅读:
    【linux高级程序设计】(第十章)Linux异步信号处理机制
    【linux高级程序设计】(第九章)进程间通信-管道 3
    【linux高级程序设计】(第九章)进程间通信-管道 2
    用ELK 实时处理搜索日志
    轻松学会多线程(二)——多线程相关概念介绍
    没有IP地址的主机怎样保持IP层联通
    1079. Total Sales of Supply Chain (25)【树+搜索】——PAT (Advanced Level) Practise
    POJ 3984 迷宫问题
    boost::asio 之udp协议的使用
    maven的学习系列(二)—maven的文件夹结构
  • 原文地址:https://www.cnblogs.com/Azhu/p/2682597.html
Copyright © 2011-2022 走看看