Oracle DML触发器和DDL触发器实例详解

yizhihongxing

对于“Oracle DML触发器和DDL触发器实例详解”的攻略,我将从以下几个方面进行详细讲解:

  1. 概述
  2. DML触发器
  3. DDL触发器
  4. 示例说明

1. 概述

在Oracle数据库中,触发器是一种特殊的程序,它可以在事件发生时自动执行一系列的操作。一般情况下,触发器主要分为两种类型:DML触发器和DDL触发器。

DML触发器是在表中进行增删改操作时触发,可以用来进行数据校验、数据同步等操作。而DDL触发器则是在数据库对象发生改变时触发,可以用来进行数据库schema管理、审计等操作。

2. DML触发器

DML触发器分为三种类型:BEFORE、AFTER和INSTEAD OF。在BEFORE类型的DML触发器中,触发器的操作发生在数据插入、更新或删除之前;在AFTER类型的DML触发器中,触发器的操作发生在数据插入、更新或删除之后;在INSTEAD OF类型的DML触发器中,触发器会代替数据插入、更新或删除操作本身。

下面是BEFORE类型的DML触发器的示例代码:

CREATE OR REPLACE TRIGGER emp_before_update
BEFORE UPDATE OF sal ON emp
FOR EACH ROW
BEGIN
    :NEW.sal := :NEW.sal * 1.1; -- 增加10%的工资
END;

在上面的触发器中,当emp表中“sal”列的数据被更新时,BEFORE类型的触发器会在更新操作执行之前被触发,并将工资增加10%。

3. DDL触发器

DDL触发器主要用于管理数据库的schema,例如创建、修改和删除表、索引、触发器等对象时触发。

当使用DDL语句创建、修改或删除一个对象时,Oracle数据库会首先检查是否已经创建一个与该DDL语句相关的触发器并进行响应操作。如果相关的触发器存在,则会在DDL语句完成之前自动执行触发器中定义的一些操作。

下面是创建DDL触发器的示例代码:

CREATE TRIGGER ddl_trig
    AFTER DDL ON SCHEMA 
BEGIN
    INSERT INTO ddl_audit(user,ddl_type,ddl_object,ddl_time)
    VALUES
    (USER,ORA_DICT_OBJ_TYPE,ORA_DICT_OBJ_NAME,SYSDATE);
END;

在上面的触发器中,当在Oracle数据库中任何对象上执行了DDL语句之后,DDL触发器会在DDL操作执行完成后自动触发,并将操作记录到“ddl_audit”表中。

4. 示例说明

接下来,我将通过两个不同的示例来展示DML触发器和DDL触发器的具体使用方法。

4.1 示例1:DML触发器

假设我们有一个名为“employee”的表,里面包含员工的姓名和年龄,我们需要一个触发器,当我们向该表中插入一条数据时,触发器可以自动将年龄加上10岁。

触发器的创建可以按照以下步骤进行:

  1. 创建employee表
CREATE TABLE employee (
    name VARCHAR2(50),
    age NUMBER(3)
);
  1. 创建触发器
CREATE OR REPLACE TRIGGER add_age
BEFORE INSERT ON employee
FOR EACH ROW
BEGIN
    :NEW.age := :NEW.age+10;
END;

在上述代码中,我们先使用CREATE TABLE语句创建了一个名为“employee”的表,然后创建了一个BEFORE INSERT类型的触发器,当我们向该表中插入一条数据时,触发器会在数据插入之前被自动触发,并将新插入的数据的年龄加上10岁。

  1. 插入数据
INSERT INTO employee (name,age) VALUES ('张三', 22);

在插入数据之后,我们可以使用SELECT语句来查看插入的数据是否被正确修改:

SELECT * FROM employee;

输出结果为:

NAME   AGE
-----  ---
张三   32

从结果中可以看出,年龄增加了10岁,说明BEFORE INSERT类型的触发器已经被正确地触发。

4.2 示例2:DDL触发器

假设我们需要在每次创建一个新的表时,向另一个表中添加一行信息,记录该表的创建时间、创建者和表名。

触发器的创建可以按照以下步骤进行:

  1. 创建记录表
CREATE TABLE table_audit (
    user_name VARCHAR2(50),
    table_name VARCHAR2(50),
    create_time DATE
);
  1. 创建DDL触发器
CREATE OR REPLACE TRIGGER table_create_trig
AFTER CREATE
ON SCHEMA
BEGIN
    INSERT INTO table_audit (user_name, table_name, create_time)
    SELECT USER, ORA_DICT_OBJ_NAME, SYSDATE
    FROM DUAL;
END;

在上述代码中,我们首先使用CREATE TABLE语句创建了一个名为“table_audit”的记录表,然后创建了一个AFTER CREATE类型的DDL触发器,当我们在数据库中创建一个新的表时,触发器会在表创建完成后自动触发,并将创建时间、创建者和表名插入“table_audit”表中。

  1. 创建新表
CREATE TABLE test_table (
    id NUMBER(10),
    name VARCHAR2(50)
);

在我们创建了一个名为“test_table”的表之后,我们可以使用以下SELECT语句来查看我们记录的信息是否被正确插入:

SELECT * FROM table_audit;

输出结果为:

USER_NAME    TABLE_NAME    CREATE_TIME
-----------  ------------  -----------
TEST         TEST_TABLE    2021-07-15 09:43:16

从结果中可以看出,我们记录的信息已经被正确地插入了“table_audit”表中,说明AFTER CREATE类型的DDL触发器已经被正确地触发。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Oracle DML触发器和DDL触发器实例详解 - Python技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • MySQL事务视图索引备份和恢复概念介绍

    MySQL 事务视图索引备份和恢复概念介绍 什么是 MySQL 事务视图索引备份与恢复 MySQL 事务视图索引备份与恢复是指通过备份和恢复MySQL数据库的方式,实现数据的完整性和一致性。MySQL 事务视图索引是指一种保证读取到的数据是事务开始时的快照,而不受其他事务的干扰的机制。 MySQL 事务视图索引备份与恢复的方法 MySQL 事务视图索引备份与…

    database 2023年5月19日
    00
  • Spring事务管理中关于数据库连接池详解

    Spring事务管理中关于数据库连接池详解 在Spring中,我们可以通过配置事务管理器来实现对数据库的事务管理。而事务管理器则需要依赖于数据库连接池。下面,我们对于Spring中数据库连接池的相关知识做一详细的介绍。 1. 数据库连接池的概念 在传统的JDBC编程中,每次操作数据库都要建立一次连接,这个过程非常浪费系统资源。而数据库连接池则能够避免这种情况…

    database 2023年5月21日
    00
  • centos7中如何利用crontab进行mysql定时备份

    下面详细讲解在CentOS 7中如何利用crontab进行MySQL定时备份的完整攻略。 步骤一:安装MySQL 在CentOS 7中,可以通过以下命令安装MySQL: sudo yum install mysql-server 安装完成后,启动MySQL并设置开机自启动: sudo systemctl start mysqld sudo systemctl…

    database 2023年5月22日
    00
  • mysql 日期和时间格式转换实现语句

    转换mysql日期和时间格式通常使用DATE_FORMAT和STR_TO_DATE两个函数。下面介绍这两个函数的使用方法和实现语句,以及两个使用示例。 1. DATE_FORMAT函数 DATE_FORMAT函数可以将日期或时间转换成指定的格式,其语法为: DATE_FORMAT(date, format) 其中,date表示需要转换的日期或时间,forma…

    database 2023年5月22日
    00
  • MySQL8.0 DDL原子性特性及实现原理

    MySQL 8.0 DDL原子性特性及实现原理攻略 什么是DDL操作 DDL(Data Definition Language)包含了用来创建(CREATE)、修改(ALTER)、删除(DROP)数据库对象(如表,视图,过程等)的语句。对于MySQL而言,通过执行各种DDL操作可以创建,修改数据库对象,从而达到管理数据的目的。 DDL对原始数据的影响 在进行…

    database 2023年5月22日
    00
  • docker配置openGauss数据库的方法详解

    让我来详细讲解“docker配置openGauss数据库的方法详解”。 1. 确定配置环境 首先,我们需要安装好Docker环境,包括Docker Engine和Docker Compose。 其次,我们需要下载openGauss的数据库镜像,可以通过以下命令快速获取: docker pull opensourcepostgres/opengauss:lat…

    database 2023年5月22日
    00
  • sql server Bulk Insert命令详细

    下面是对 SQL Server Bulk Insert 命令的详细讲解: 什么是 SQL Server Bulk Insert 命令? SQL Server Bulk Insert 命令是一种用于将数据从外部文件快速导入到 SQL Server 数据表中的命令。它能通过一次性插入大量数据,实现高效、快速的数据导入操作。 SQL Server Bulk Ins…

    database 2023年5月21日
    00
  • Redis(六)——高可用之哨兵sentinel配置与启动及主从服务宕机与恢复

    、主从复制高可用 #主从复制存在的问题: 1 主从复制,主节点发生故障,需要做故障转移,可以手动转移:让其中一个slave变成master 2 主从复制,只能主写数据,所以写能力和存储能力有限     哨兵是对Redis的系统的运行情况的监控,它是一个独立进程,它会独立运行,功能有二个: 通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服…

    Redis 2023年4月13日
    00
合作推广
合作推广
分享本页
返回顶部