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

  • 相关阅读:
    4.10Python数据处理篇之Matplotlib系列(十)---文本的显示
    4.9Python数据处理篇之Matplotlib系列(九)---子图分布
    4.8Python数据处理篇之Matplotlib系列(八)---Figure的学习
    4.7Python数据处理篇之Matplotlib系列(七)---matplotlib原理分析
    4.6Python数据处理篇之Matplotlib系列(六)---plt.hist()与plt.hist2d()直方图
    4.5Python数据处理篇之Matplotlib系列(五)---plt.pie()饼状图
    4.4Python数据处理篇之Matplotlib系列(四)---plt.bar()与plt.barh条形图
    4.3Python数据处理篇之Matplotlib系列(三)---plt.plot()折线图
    Angular 定时器$timeout和$interval,延时调用
    javascript中top、clientTop、scrollTop、offsetTop的讲解(转载加总结)
  • 原文地址:https://www.cnblogs.com/Azhu/p/2682597.html
Copyright © 2011-2022 走看看