Oracle 触发器

平易近人
• 阅读 4053

1. Oracle 触发器

1.1. 定义

触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由触发事件来启动运行。即触发器是当某个事件发生时自动地隐式运行。不能接收参数,不能被调用

触发事件包括:

  1. 执行DML 语句(使用INSERT、UPDATE、DELETE 语句对表或视图执行数据处理操作);
  2. 执行DDL语句(使用CREATE、ALTER、DROP语句在数据库中创建、修改、删除模式对象);
  3. 引发数据库系统事件(如系统启动或退出、产生异常错误等);
  4. 引发用户事件(如登录或退出数据库操作)。

1.2. 语法

create [or replace] trigger tri_name
   [before | after | instead of] tri_event
   on table_name | view_name | user_name | db_name
      [for each row] [when tri_condition]
begin
   plsql_sentences;
end tri_name;
  • before | after | instead of:表示“触发时机”的关键字。before 表示在执行DML 等操作之前触发;after 表示在DML等操作之后发生;instead of 表示触发器为 替代触发器。
  • on:表示操作的数据表、视图、用户模式和数据库等,对它们执行某种数据操作(比如对表执行INSERT、ALTER、DROP 等操作),将引起触发器的运行。
  • for each row:指定触发器为行级触发器,当DML语句对每一行数据进行操作时都会引起该触发器的运行。如果未指定该条件,则表示创建语句级触发器,这时无论数据操作影响多少行,触发器都只会执行一次。
  • tri_condition:表示触发条件表达式。

当触发器被触发时,要使用被插入、更新或删除的记录中的列值,有时要使用操作前、后列的值.
:NEW 修饰符访问操作完成后列的值
:OLD 修饰符访问操作完成前列的值

特性 INSERT UPDATE DELETE
OLD NULL 实际值 实际值
NEW 实际值 实际值 NULL

1.3. 分类

1.3.1. 语句级触发器:

不使用for each row的触发器。无论所触发的DML 语句影响了多少行数据,触发器都只会执行一次。

1.3.2. 行级触发器

使用for each row的触发器。当DML语句对每一行数据进行操作时都会引起该触发器的运行。

1.3.3. 替换触发器

使用instead of关键字的触发器。

1.3.4. 用户事件触发器

用户事件触发器是因进行 DDL 操作或用户登录、退出等操作而引起运行的一种触发器,引起该类型触发器运行的常见用户事件包括:CREATE、ALTER、DROP、ANALYZE、COMMENT、GRANT、REVOKE、RENAME、TRUNCATE、SUSPEND、LOGON 和LOGOFF 等。

1.4. 1例子

1.4.1. 使用触发器实现多表视图的insertupdatedelete

--创建两张测试表
create table temp_a
(
    a1 varchar2(10) primary key ,
    a2 varchar2(10)
);

create table temp_b
(
    a1 varchar2(10) primary key ,
    b1 varchar2(10),
    b2 varchar2(10)
);

--创建测试视图
create view TEMP_c
as
select a.a1 as a1,
       a.a2 as a2,
       b.b1 as b1,
       b.b2 as b2
from temp_a a
         inner join temp_b b on a.a1 = b.a1;
 

--创建触发器
CREATE OR REPLACE TRIGGER TEMP_C_TRIGGER
    INSTEAD OF INSERT OR UPDATE OR DELETE
    ON TEMP_C
    FOR EACH ROW
BEGIN
    IF INSERTING
    THEN
        INSERT INTO TEMP_A(TEMP_A.A1, TEMP_A.A2) VALUES (:NEW.A1, :NEW.A2);
        INSERT INTO TEMP_B(TEMP_B.A1, TEMP_B.B1, TEMP_B.B2) VALUES (:NEW.A1, :NEW.B1, :NEW.B2);
    ELSIF UPDATING
    THEN
        UPDATE TEMP_A
        SET A2=:NEW.A2
        WHERE A1 = :NEW.A1;

        UPDATE TEMP_B
        SET B1=:NEW.B1,
            B2=:NEW.B2
        WHERE A1 = :NEW.A1;
    ELSIF DELETING
    THEN
        DELETE FROM TEMP_A WHERE A1 = :OLD.A1;
        DELETE FROM TEMP_B WHERE A1 = :OLD.A1;
    END IF;
END;

--插入语句
INSERT INTO TEMP_C(A1, A2, B1, B2)
VALUES ('A1_1', 'A2_1', 'B1_1', 'B2_2');

如果没有触发器,直接修改则会报错:

42000][1776] ORA-01776: 无法通过联接视图修改多个基表

1.4.2. 使用触发器监控登录用户行为

--创建日志表
create table temp_log
(
    log_id     varchar2(20) primary key,
    log_time   date,         -- 时间
    log_obj    varchar2(50), --操作对象
    log_action varchar2(50), --操作事件
    log_user   varchar2(50)  --操作用户
);

--创建一个自增序列
create sequence seq_id start with 1000 nomaxvalue cache 20 increment by 1;

--创建事件触发器

create or replace trigger log_trigger
    after ALTER or CREATE or DROP
    ON exercise.schema
begin
    insert into TEMP_LOG(log_id, log_time, log_obj, log_action, log_user)
    VALUES (SEQ_ID.nextval, systimestamp, ORA_DICT_OBJ_NAME, ORA_SYSEVENT, ORA_LOGIN_USER);

end;

--新增
create table temp_v
(
    a1 varchar2(10) primary key,
    b1 varchar2(10),
    b2 varchar2(10)
);
/*
ORA_DICT_OBJ_NAME 操作所对应的数据库对象。
ORA_SYSEVENT 获取触发器的系统事件名。
ORA_LOGIN_USER 获取登录用户名。

schema:
A schema is a collection of logical structures of data, or schema objects. A schema is owned by a database user and has the same name as that user. Each user owns a single schema.
*/

--监控用户DML操作
--SELECT 不能作为触发事件
create or replace trigger log_dml_trigger
    before ALTER or CREATE or DROP
    ON exercise.schema
begin
    insert into TEMP_LOG(log_id, log_time, log_obj, log_action, log_user)
    VALUES (SEQ_ID.nextval, systimestamp, ORA_DICT_OBJ_NAME, ORA_SYSEVENT, ORA_LOGIN_USER);
end;


--登录监控触发器
create or replace trigger log_login_trigger
    after LOGON
    ON exercise.schema
begin
    insert into TEMP_LOG(log_id, log_time, log_obj, log_action, log_user)
    VALUES (SEQ_ID.nextval, systimestamp, ORA_DICT_OBJ_NAME, ORA_SYSEVENT, ORA_LOGIN_USER);
end;

1.5. 参考

oracle触发器
oracle触发器
oracle触发器

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
mysql备份与恢复
Sql文件备份与恢复导出sql文件然后导出,_忽略了触发器_,触发器需要手动建立mysqldumpsetgtidpurgedOFFdefaultcharactersetutf8skiptriggershostP3306uuserppassworddbnameD
Wesley13 Wesley13
3年前
MySQL数据库表设计规范
一、数据库设计1、一般都使用INNODB存储引擎,除非读写比率<1%,才考虑使用MYISAM存储引擎;其他存储引擎请在DBA的建议下使用。2、Storedprocedure(包括存储过程,函数,触发器)对于MYSQL来说还不是很成熟,没有完善的出错记录处理,不建议使用。3、UUID(),USER()这样的
Wesley13 Wesley13
3年前
Mysql优化
一、存储过程1.1、什么是存储过程  就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法。ps:存储过程跟触发器有点类似,都是一组SQL集,但是存储过程是主动调用的,且功能比触发器更加强大,触发器是某件事触发后自动调用。1.2、存储过程有哪些特性  有输入输出参数,可
Wesley13 Wesley13
3年前
MySQL触发器,视图
MySQL触发器,视图一.触发器1.普义2.定义3.解释4.结构5.简单示例二.MySQL视图:由select语句创建只能用于select1.定义2.优缺点:3.作用4.示例一.触发器1.普义在用来某
Wesley13 Wesley13
3年前
oracle中的trigger
https://blog.csdn.net/indexman/article/details/8023740/https://www.cnblogs.com/sharpest/p/7764660.htmlhttps://www.cnblogs.com/yaobolove/p/4781971.html 触发器在数据库里以独立的对象存储,它与存储过程
Wesley13 Wesley13
3年前
MySql在触发器中调用存储过程
不太写触发器,今天遇到个语法问题,在朋友(DBA)的帮助下解决了,记录下来。需求:在CLASS\_PROPERTY\_REL删除记录时,调用存储过程gen\_ci\_property\_value问题反馈:SQL错误106442000:YouhaveanerrorinyourSQLsyntax;check
Wesley13 Wesley13
3年前
MySQL视图,函数,触发器,存储过程
1\.视图  视图是一个虚拟表,它的本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用【名称】即可获取结果集,可以将该结果集当做表来使用。使用视图我们可以把查询过程中的临时表摘出来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的sql了,直接去视图中查找即可,但视图有明显地效率问题,并且视
Stella981 Stella981
3年前
HighGo Database触发器使用案例(APP)
目录环境文档用途详细信息环境系统平台:MicrosoftWindows(64bit)10版本:5.6.4文档用途本文介绍瀚高数据库中查询触发器信息的方法及触发器的使用案例。详细信息一、触发器介绍HighGoDatabase触发器是先创建触发器函数,再创建触
Stella981 Stella981
3年前
SQL Server数据库基础知识——存储过程
SQLServer数据库基础知识存储过程概述什么是存储过程?存储过程的种类如何创建、修改、删除、调用存储过程?存储过程的优缺点存储过程和触发器的区别?存储过程和函数的区别?
Easter79 Easter79
3年前
SQL Server数据库基础知识——存储过程
SQLServer数据库基础知识存储过程概述什么是存储过程?存储过程的种类如何创建、修改、删除、调用存储过程?存储过程的优缺点存储过程和触发器的区别?存储过程和函数的区别?
Wesley13 Wesley13
3年前
Oracle存储过程创建及Java调用
在大型数据库系统中,有两个很重要作用的功能,那就是存储过程和触发器。在数据库系统中无论是存储过程还是触发器,都是通过SQL语句和控制流程语句的集合来完成的。相对来说,数据库系统中的触发器也是一种存储过程。存储过程在数据库中运算时自动生成各种执行方式,因此,大大提高了对其运行时的执行速度。在大型数据库系统如Oracle、SQLServer中都不仅提供了