• Oracle学习笔记二十六:触发器的使用


    一、触发器简介

    • 什么是触发器(trigger)

      • 触发器在数据库里以独立的对象存储,由数据库产生某一类事件而启动运行,即触发器是当某个事件发生时自动地隐式运行。

    • 触发器的特点

      • 由特定事件触发,外部无法调用。

      • 触发器无参数。

      • 一个表上最多可有12个触发器。

    • 触发器的作用

      • 常用来完成由数据库的完整性约束难以完成的复杂业务规则的约束,或用来监视对数据库的各种操作,实现审计的功能。

    二、触发器分类

    1)DML触发器

      • Oracle可以在执行DML语句时运行触发,同时可以指定在DML操作前或操作后进行触发,指定对每个行或语句操作上进行触发。

    2)替代触发器

      • 由于在Oracle里,不能直接对由两个以上的表建立的视图进行操作,所以给出了替代触发器。Oracle专门为进行视图操作的一种处理方法。

    3)系统触发器

      • Oracle提供了第三种类型的触发器叫系统触发器。它可以在Oracle数据库系统的事件中进行触发,如Oracle系统的启动与关闭等。

    三、DML触发器

    3.1、DML触发器阐述

      • 也就是在对表进行insert/delete/update操作时会执行的触发器。

    3.2、DML触发器语法

      CREATE [OR REPLACE] TRIGGER 触发器名称

        {BEFORE|AFTER}

        {INSERT|DELETE|UPDATE[ OF COLUMN1|COLUMN2……]}

        ON {[SCHEMA.]表名|{[SCHEMA.]视图名}

        [FOR EACH ROW]

        [WHEN 条件表达式]

      BEGIN

        [语句块]

      END;

    3.3、DML触发器实例

    • 增加一个测试记录表,将增删改的记录插入到此表中。

    CREATE TABLE "SYSTEM"."EMP_HIS" 
    (
        "EMPNO" VARCHAR2(10 BYTE) NOT NULL ENABLE,
        "ENAME" VARCHAR2(20 BYTE) NOT NULL ENABLE,
        "SAL" NUMBER(8, 2),
        "COMM" NUMBER(8, 2),
        "REM" VARCHAR2(20 BYTE)
    )
    PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
        STORAGE ( INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL
        DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT )
    TABLESPACE "SYSTEM";

    1)增加记录

    create or replace trigger triEmpForInsert
        after insert on emp for each row
    begin
        insert into emp_his (empno,ename,sal,comm,rem) values (:new.empno,:new.ename,:new.sal,:new.comm,'增加后');
    end;

    2)删除记录

    create or replace trigger triEmpForDelete
        before delete on emp for each row
    begin
        insert into emp_his (empno,ename,sal,comm,rem) values (:old.empno,:old.ename,:old.sal,:old.comm,'删除前');
    end;

    3)修改记录

    create or replace trigger triEmpForUpdate
        after update on emp for each row
    begin
        insert into emp_his (empno,ename,sal,comm,rem) values (:old.empno,:old.ename,:old.sal,:old.comm,'更新前');
        insert into emp_his (empno,ename,sal,comm,rem) values (:new.empno,:new.ename,:new.sal,:new.comm,'更新后');
    end;
  • 相关阅读:
    [美团 CodeM 初赛 Round A]最长树链
    [POI2005]Toy Cars
    [CodePlus2017NOV]晨跑
    [JLOI2011]不重复数字
    [NEERC2007][SHOI2008]Cactus Reloaded
    [NOI2015]软件包管理器
    [HAOI2015]树上操作
    CF1097D Makoto and a Blackboard
    Luogu P5339 [TJOI2019]唱、跳、rap和篮球
    HNCPC2019H 有向图
  • 原文地址:https://www.cnblogs.com/atomy/p/16376953.html
Copyright © 2020-2023  润新知