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

对于“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日

相关文章

  • SQL 变换结果集成多行

    在 SQL 中,我们可以使用一些变换(Transformation)函数将结果集转换为多行或单行。以下是 SQL 变换结果集成多行的完整攻略,包含两条实例。 一、使用 GROUP_CONCAT 在 MySQL 中,我们可以使用 GROUP_CONCAT 函数将多行数据合并成一行。如下: SELECT category, GROUP_CONCAT(produc…

    database 2023年3月27日
    00
  • SQL中代替Like语句的另一种写法

    SQL中代替Like语句的另一种写法是使用正则表达式。正则表达式是一种描述文本模式的方法,我们可以用它来匹配、查找和替换文本中的字符。 在SQL中,可以使用RLIKE或REGEXP操作符实现正则表达式匹配,代替Like语句。 下面是使用RLIKE操作符实现正则表达式匹配的语法: SELECT * FROM table_name WHERE column_na…

    database 2023年5月19日
    00
  • 基于oracle expdp命令的使用详解

    基于oracle expdp命令的使用详解 介绍 expdp是Oracle 10g及以上版本中自带的备份和导出工具,用于将数据从Oracle数据库导出到其他数据库或文件中。它是Oracle数据传输的标准选择,并且提供了比传统exp更好的灵活性和更好的性能。 命令格式 expdp命令的语法如下所示: expdp username/password@connec…

    database 2023年5月21日
    00
  • redis++怎么编译、安装及使用

    这篇“redis++怎么编译、安装及使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“redis++怎么编译、安装及使用”文章吧。 前言 之前给公司作网关,一直想找个牛逼点的C++ 的 或者 C的 redis连接库。 结果很多都不近人意。 常见…

    2023年4月10日
    00
  • MySQL函数与存储过程字符串长度限制的解决

    MySQL函数与存储过程在使用过程中受到了字符串长度限制的影响,这可能会影响我们对其的正常使用。因此,在使用MySQL函数与存储过程时,如何解决字符串长度限制的问题是一件十分重要的事情。下面我们将会给大家介绍一些解决方法。 方法一:设置SQL_MODE 首先需要了解一下什么是SQL_MODE。SQL_MODE是MySQL的一个系统变量,它决定了MySQL数据…

    database 2023年5月22日
    00
  • redis 客户端库 之 spring data redis —– 源码解析系列(一)之 jedis 库连接 redis 集群

    一、背景     spring boot redis 接入 redis ,提供了两种库的方式,一是:lettuce,而是:jedis,被系列介绍接入 jedis时的源码 二、代码示例(包含maven依赖) <!– spring config –> <dependency> <groupId>org.springfram…

    Redis 2023年4月11日
    00
  • mysql连接查询中and与where的区别浅析

    MySQL连接查询中and与where的区别浅析 在MySQL中,连接查询是一种强大的查询方式,可以同时查询多个表,获取丰富的查询结果。而在连接查询中,我们常常会使用到and和where关键字,它们的作用虽然有些类似,但又存在着很大的差别。本文将详细探讨这两个关键字在连接查询中的使用方法和区别。 and关键字 and是连接查询中非常常用的一个关键字,它用于连…

    database 2023年5月22日
    00
  • Mysql在项目中相关使用方法指南(简单操作数据库)

    MySQL在项目中相关使用方法指南 MySQL是一种关系型数据库管理系统,广泛用于网站、企业管理系统等应用程序的数据存储。在项目中使用MySQL,需要掌握基本的SQL语法和MySQL客户端的使用方法。 安装MySQL客户端和服务端 在使用MySQL之前,需要先安装MySQL客户端和服务端。客户端提供了与MySQL服务器之间通讯的功能,服务端提供了对数据库的读…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部