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日

相关文章

  • Oracle数据创建虚拟列和复合触发器的方法

    下面是详细讲解“Oracle数据创建虚拟列和复合触发器的方法”的完整攻略。 创建虚拟列 确定需要创建虚拟列的表,并确认虚拟列的计算公式。 使用 ALTER TABLE 语句添加虚拟列,语法如下: sql ALTER TABLE table_name ADD (column_name data_type [GENERATED ALWAYS] AS (expre…

    database 2023年5月21日
    00
  • SQL SERVER 的SQL语句优化方式小结

    SQL Server 的 SQL 语句优化是提高数据库性能的重要策略之一。下面就来详细讲解 SQL Server 的 SQL 语句优化方式小结。 1. 确认性能瓶颈 首先需要确认数据库性能瓶颈所在,通常可以通过 SQL Server 的系统对象或 SQL Profiler 工具来分析瓶颈所在。一些典型的瓶颈常常出现在: 硬件: CPU、内存、磁盘等; 网络 …

    database 2023年5月19日
    00
  • 在SQL Server中使用SQL语句查询一个存储过程被其它所有的存储过程引用的存储过程名

    要查询一个存储过程被哪些其它存储过程引用,在SQL Server中可以使用以下步骤: 使用系统存储过程sp_depends查询被引用的存储过程名 sp_depends <stored_proc_name>; 其中,<stored_proc_name>是要查询的存储过程名。如果该存储过程被引用,则该语句将返回被引用该存储过程的对象列表,…

    database 2023年5月21日
    00
  • MySQL数据库InnoDB引擎主从复制同步经验总结

    MySQL数据库InnoDB引擎主从复制同步经验总结 什么是MySQL主从复制? MySQL主从复制是MySQL高可用性的一种解决方案,它的原理是将一个MySQL服务器作为主服务器,其他多个MySQL服务器作为从服务器,当主服务器上的数据发生变化时,自动同步到从服务器上。这就确保了数据在多个MySQL服务器之间的同步和备份。 InnoDB引擎与主从复制同步 …

    database 2023年5月18日
    00
  • sql server 创建临时表的使用说明

    创建临时表是SQL Server中常用的一种操作,可以在查询过程中临时存储数据,方便后续使用,同时也不会占用数据库中的实际表格。本文将介绍如何创建临时表并使用它,涉及到创建、查询、修改、删除等操作。 1. 创建临时表的语法 在SQL Server中,创建临时表需要使用CREATE TABLE语句。临时表分为本地临时表和全局临时表两种,本地临时表只能在当前会话…

    database 2023年5月21日
    00
  • html5 Web SQL Database 之事务处理函数transaction与executeSQL解析

    HTML5 Web SQL Database是一种基于浏览器端的本地数据库解决方案,而其中的事务处理函数transaction以及执行SQL语句的函数executeSql是使用Web SQL Database实现更加复杂的交互应用所必须要掌握的。 1. 事务处理函数transaction transaction是Web SQL Database中的事务处理函…

    database 2023年5月21日
    00
  • MySQL 设计和命令行模式下建立详解

    MySQL 是使用得非常广泛的一款关系型数据库管理系统。在 MySQL 中,我们可以使用 SQL 语言对数据库进行各种操作,包括创建数据库、创建表、插入数据、更新数据、删除数据等等。下面,我们将详细讲解 MySQL 的设计和命令行模式下的建立。 MySQL 设计 数据库设计 在 MySQL 中,我们首先要进行的操作就是设计数据库。设计数据库时需要考虑以下几个…

    database 2023年5月22日
    00
  • egg实现登录鉴权(二):连接数据库(mysql)

    前一篇实现了基本的生成token和验证token的功能,这其实并没什么用。这一篇主要实现对数据库里的人员进行验证。 需求 登录:查询数据库的user表验证该人员是否存在 user表中存在该nickname,生成token返回 user表中不存在该nickname,返回{code:’404′,msg:’不存在该人员’} 查询 查询所有user,无需传token…

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