码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【Oracle】Oracle系列之十四--触发器


    文章目录

    • 往期回顾
    • 前言
    • 1. 基本概念
    • 2. 行级触发器
    • 3. 语句级触发器
    • 4. 系统级触发器
    • 5. 替代触发器

    往期回顾

    • 【Oracle】Oracle系列之一–Oracle数据类型
    • 【Oracle】Oracle系列之二–Oracle数据字典
    • 【Oracle】Oracle系列之三–Oracle字符集
    • 【Oracle】Oracle系列之四–用户管理
    • 【Oracle】Oracle系列之五–Oracle表空间
    • 【Oracle】Oracle系列之六–Oracle表分区
    • 【Oracle】Oracle系列之七–表的创建与管理
    • 【Oracle】Oracle系列之八–SQL查询
    • 【Oracle】Oracle系列之九–Oracle常用函数
    • 【Oracle】Oracle系列之十–Oracle正则表达式
    • 【Oracle】Oracle系列之十一–PL/SQL
    • 【Oracle】Oracle系列之十二–视图、记录、同义词、序列
    • 【Oracle】Oracle系列之十三–游标

    前言

    1. 基本概念

    触发器(trigger)是一种数据库对象,可以看作由事件来触发的特殊存储过程。当一个特定的事件发生时,会自动执行在数据库表上的某些操作,比如当对一个表进行操作(insert,delete, update)时就会激活它执行,使得数据库其他数据发生变化。

    触发器常用于加强数据的完整性约束和业务规则等。

    数据验证:确保插入、更新或删除操作符合业务规则和完整性约束条件。
    数据转换:将插入、更新或删除操作中的数据转换为其他格式或单位。
    数据记录:记录插入、更新或删除操作的详细信息,例如时间戳、用户ID等。
    Oracle触发器的语法如下:

    CREATE OR REPLACE TRIGGER trigger_name
    {BEFORE | AFTER} {INSERT | UPDATE | DELETE}
    [OF column_name]
    [ON table_name]
    [REFERENCING OLD AS old NEW AS new]
    [FOR EACH ROW]
    WHEN (condition)
    DECLARE
        -- 声明局部变量和游标
    BEGIN
        -- 执行触发器操作
    END;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    各关键字含义如下:

    CREATE OR REPLACE TRIGGER:创建或替换一个触发器。
    BEFORE | AFTER:指定触发器在插入、更新或删除操作之前(BEFORE)还是之后(AFTER)触发。
    INSERT | UPDATE | DELETE:指定触发器在哪种操作上触发。
    [OF column_name]:指定只对某一列进行操作。
    [ON table_name]:指定触发器所属的表名。
    [REFERENCING OLD AS old NEW AS new]:指定使用OLD和NEW伪记录引用旧值和新值。
    [FOR EACH ROW]:指定为每一行执行触发器操作。
    [WHEN (condition)]:指定触发器执行的条件。
    DECLARE:声明局部变量和游标。
    BEGIN:开始执行触发器操作。
    END;:结束触发器代码块。
    /:表示触发器定义结束。
    Oracle 触发器主要有三种类型:

    行级触发器 (Row-level triggers):在每次插入、更新或删除单个记录时触发。
    语句级触发器 (Statement-level triggers):在 SQL 语句执行完毕后触发。
    系统级触发器 (System-level triggers):在数据库整体运行时触发。

    2. 行级触发器

    行级触发器是一种基于行的触发器,它会在每次插入、更新或删除单个记录时触发。该触发器通常用于检查记录的值是否符合特定条件,并防止非法操作。

    e.g.

    -- delete时触发
    Create Or Replace Trigger del_deptid
    After Delete On dept
    For Each Row
    Begin
    Delete From emp Where deptno=:Old.deptno;
    End;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    – insert时触发

    Create Or Replace Trigger insert_dept 
    After Insert On dept
    For Each Row 
    Begin
    Insert Into emp(empno,ename,deptno) Values('8999','bob',:New.deptno);
    End;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    – update时触发

    Create Or Replace Trigger update_dept 
    After Update On dept
    For Each Row 
    Begin
    Update emp Set deptno=:New.deptno Where deptno=:Old.deptno;
    End;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    注意:update的触发器种使用了 :Old 和 :New 句柄来引用被操作的记录的旧值和新值。:Old.deptno 引用了被更新记录的 id 值,而 :New.deptno 则引用了该记录被更新后的 id 值。通过这种方式可在触发器中获取并记录被修改的记录的详细信息。

    – 利用行级触发器与SEQUENCE生成自增ID

    create or replace trigger trg_emp
    before insert on 
    T_EMP
    for each row 
    begin 
    select seq_EMP_ID.nextval into :new.id from dual; 
    End;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3. 语句级触发器

    语句级触发器是一种基于 SQL 语句的触发器,它会在 SQL 语句执行完毕后触发。通常用于记录日志,或在多个表之间同步数据。

    Create Or Replace Trigger dnl_emp
    After Insert Or Delete Or Update On emp
    Begin
    If Inserting Then
    Insert Into mylog Values(User,Sysdate,'I');
    Elsif Deleting Then
    Insert Into mylog Values(User,Sysdate,'D');
    Else
    Insert Into mylog Values(User,Sysdate,'U');
    End If;
    End;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    4. 系统级触发器

    系统级触发器是一种可以在整个数据库级别上触发的触发器,常用于监控数据库对象,处理用户登录、注销、DDL语句以及其他重要事件,可以让管理员或者DBA更好地掌握和管理数据库。

    e.g. 将所有SELECT查询操作进行记录到日志表(audit_log)中。

    CREATE OR REPLACE TRIGGER audit_select
    AFTER SELECT ON SCOTT.EMP
    FOR EACH STATEMENT
    BEGIN
      INSERT INTO audit_log
      (username, query_date, table_name, sql_text)
      VALUES
      (USER, SYSDATE, 'EMP', ora_sql_txt);
    END;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    5. 替代触发器

    由于ORACLE里,不能直接对由两个以上的表建立的视图进行操作,因此替代触发器用于解决当组成视图的表是两个及两个以上时,无法更新的问题。

    e.g.

    Create Or Replace Trigger tr_v_e_d
    Instead Of Insert On v_emp_dept
    For Each Row
    Begin
    Insert Into dept(deptno,dname) Values(:New.deptno,:New.dname);
    Insert Into emp(empno,ename,job,deptno) Values(:New.empno,:New.ename,:New.job,:New.deptno);
    End;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    OpenCV项目开发实战--主成分分析(PCA)的特征脸应用(附C++/Python实现源码)
    docker安装RabbitMQ
    python提效小工具-统计xmind用例数量
    从“AI玩具”到“创作工具”的云原生改造之路
    Android 12.0 中 清除通知 , 系统源码分析(二)
    搜索算法工程师必备知识储备
    【操作系统学习笔记】处理器管理1.5
    初识ElasticSearch
    【南京大学操作系统(蒋炎岩)】(五) 并发 Bug 和应对
    Redis热key如何发现和解决
  • 原文地址:https://blog.csdn.net/u011397981/article/details/133470299
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号