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

打印 上一主题 下一主题

主题 903|帖子 903|积分 2709

一、触发器简介

• 什么是触发器(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触发器实例

• 增加一个测试记录表,将增删改的记录插入到此表中。
  1. CREATE TABLE "SYSTEM"."EMP_HIS"
  2. (
  3.     "EMPNO" VARCHAR2(10 BYTE) NOT NULL ENABLE,
  4.     "ENAME" VARCHAR2(20 BYTE) NOT NULL ENABLE,
  5.     "SAL" NUMBER(8, 2),
  6.     "COMM" NUMBER(8, 2),
  7.     "REM" VARCHAR2(20 BYTE)
  8. )
  9. PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  10.     STORAGE ( INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL
  11.     DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT )
  12. TABLESPACE "SYSTEM";
复制代码
1)增加记录
  1. create or replace trigger triEmpForInsert
  2.     after insert on emp for each row
  3. begin
  4.     insert into emp_his (empno,ename,sal,comm,rem) values (:new.empno,:new.ename,:new.sal,:new.comm,'增加后');
  5. end;
复制代码
2)删除记录
  1. create or replace trigger triEmpForDelete
  2.     before delete on emp for each row
  3. begin
  4.     insert into emp_his (empno,ename,sal,comm,rem) values (:old.empno,:old.ename,:old.sal,:old.comm,'删除前');
  5. end;
复制代码
3)修改记录
  1. create or replace trigger triEmpForUpdate
  2.     after update on emp for each row
  3. begin
  4.     insert into emp_his (empno,ename,sal,comm,rem) values (:old.empno,:old.ename,:old.sal,:old.comm,'更新前');
  5.     insert into emp_his (empno,ename,sal,comm,rem) values (:new.empno,:new.ename,:new.sal,:new.comm,'更新后');
  6. end;
复制代码
 

来源:https://www.cnblogs.com/atomy/archive/2022/06/16/16376953.html
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

数据人与超自然意识

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表