DML触发器

简介: 8月更文挑战第22天

DML触发器(Data Manipulation Language Trigger)是数据库中一种特殊的存储过程,它在指定的数据修改语言事件(如INSERT、UPDATE或DELETE)发生时自动执行。DML触发器常用于维护数据的完整性和一致性,它可以在数据变动之前(BEFORE)或之后(AFTER)触发,并且可以根据触发器的定义执行相应的操作。
以下是DML触发器的一些关键点:

类型

  • BEFORE触发器:在执行INSERT、UPDATE或DELETE操作之前触发。
  • AFTER触发器:在执行INSERT、UPDATE或DELETE操作之后触发。

    用途

  • 数据验证:确保数据的准确性和合法性。
  • 数据审计:记录数据的变更历史。
  • 业务规则实施:强制执行复杂的业务规则。
  • 级联操作:在修改数据时自动更新相关表。

    创建语法(以Oracle为例)

    CREATE [OR REPLACE] TRIGGER trigger_name
    {BEFORE | AFTER} {
        INSERT | UPDATE | DELETE} ON table_name
    [FOR EACH ROW]
    DECLARE
      -- 声明变量
    BEGIN
      -- 触发器要执行的操作
    EXCEPTION
      -- 异常处理
    END;
    

    示例

    假设有一个员工表employee,我们希望在更新员工工资之前检查新工资是否合理:
    CREATE OR REPLACE TRIGGER check_salary
    BEFORE UPDATE ON employee
    FOR EACH ROW
    BEGIN
      IF :NEW.salary < :OLD.salary THEN
          RAISE_APPLICATION_ERROR(-20001, '新工资不能低于旧工资');
      END IF;
    END;
    
    在这个触发器中,:NEW代表更新后的行数据,而:OLD代表更新前的行数据。如果新工资低于旧工资,触发器将抛出一个错误,阻止更新操作。

    注意事项

  • 触发器可能会增加数据库操作的复杂性和维护难度。
  • 过多的触发器可能会导致性能问题。
  • 触发器中的代码应该尽量简单,避免进行复杂的业务逻辑处理。
    在使用DML触发器时,应该根据实际业务需求和数据库的规范来设计和实施。

查看触发器的定义取决于你使用的数据库管理系统(DBMS)。以下是一些常见数据库系统中查看触发器定义的方法:

Oracle

在Oracle数据库中,你可以使用USER_TRIGGERSDBA_TRIGGERS数据字典视图来查看触发器的定义。以下是一些查看触发器定义的SQL命令:

-- 查看当前用户拥有的触发器
SELECT trigger_name, trigger_type, triggering_event, table_name, status, trigger_body
FROM user_triggers
WHERE trigger_name = 'TRIGGER_NAME';
-- 或者使用DBMS_METADATA包获取触发器的创建脚本
SELECT DBMS_METADATA.GET_DDL('TRIGGER', 'TRIGGER_NAME') FROM dual;

MySQL

在MySQL中,你可以使用INFORMATION_SCHEMA.TRIGGERS表或SHOW CREATE TRIGGER语句来查看触发器的定义:

-- 使用INFORMATION_SCHEMA
SELECT * FROM INFORMATION_SCHEMA.TRIGGERS
WHERE TRIGGER_NAME = 'TRIGGER_NAME' AND TRIGGER_SCHEMA = 'DATABASE_NAME';
-- 使用SHOW CREATE TRIGGER
SHOW CREATE TRIGGER TRIGGER_NAME;

SQL Server

在SQL Server中,你可以使用系统视图sys.triggerssys.sql_modules来查看触发器的定义:

-- 使用系统视图
SELECT m.definition
FROM sys.triggers t
JOIN sys.sql_modules m ON t.object_id = m.object_id
WHERE t.name = 'TRIGGER_NAME';

PostgreSQL

在PostgreSQL中,你可以使用pg_triggerpg_class系统表来查看触发器的定义:

-- 查看触发器定义
SELECT pg_get_triggerdef(oid)
FROM pg_trigger
WHERE tgname = 'TRIGGER_NAME';
-- 或者查看特定表上的触发器
SELECT pg_get_triggerdef(trig.oid)
FROM pg_trigger trig
JOIN pg_class rel ON trig.tgrelid = rel.oid
WHERE rel.relname = 'TABLE_NAME' AND trig.tgname = 'TRIGGER_NAME';

请将TRIGGER_NAME替换为你想要查看的触发器的名称,如果有必要,还需要将DATABASE_NAMETABLE_NAME替换为实际的数据库或表名。
这些命令会返回触发器的定义,你可以通过阅读这些定义来了解触发器的逻辑和行为。

相关文章
|
SQL 数据库 数据安全/隐私保护
|
SQL Go
SQL Server如何用触发器捕获DML操作的会话信息
需求背景        上周遇到了这样一个需求,维护人员发现一个表的数据经常被修改,由于历史原因;文档缺少;以及维护人员的经常变更,导致他们对系统也业务也不完全熟悉,他们也不完全清楚哪些系统和应用程序会对这个表的数据进行操作。
1052 0
|
SQL Go 应用服务中间件
SQL Server如何用触发器捕获DML操作的会话信息
原文:SQL Server如何用触发器捕获DML操作的会话信息 需求背景        上周遇到了这样一个需求,维护人员发现一个表的数据经常被修改,由于历史原因;文档缺少;以及维护人员的经常变更,导致他们对系统也业务也不完全熟悉,他们也不完全清楚哪些系统和应用程序会对这个表的数据进行操作。
921 0
|
SQL Oracle 关系型数据库
PL/SQL12.1 ——DML 触发器
 http://blog.csdn.net/robinson_0612/article/details/6098258  何谓触发器?简言之,是一段命名的PL/SQL代码块,只不过该代码块在特定的条件下被触发并且执行。
1167 0
|
SQL Perl
PL/SQL12.2 ——DML 触发器
http://blog.csdn.net/robinson_0612/article/details/6098263  INSTEAD OF 触发器常用于管理编写不可更新的视图,INSTEAD-OF触发器必须是行级的。
785 0
|
SQL
DML 触发器计划指南
有两个用于设计 DML 触发器的选项: 执行 INSTEAD OF 触发器代替通常的触发操作。还可以对带有一个或多个基表的视图定义 INSTEAD OF 触发器,这些触发器可以扩展视图可支持的更新类型。
881 0
|
SQL 数据库连接
DML 触发器 Set选项
SET 语句选项 当 ODBC 应用程序连接到 SQL Server 时,服务器将自动为会话设置下列选项: SET QUOTED_IDENTIFIER ON SET TEXTSIZE 2147483647 SET ANSI_DEFAULTS ON SET CURSOR_CLOSE_ON_COMMIT OFF SET IMPLICIT_TRANSACTIONS OFF 这些设置会增加 ODBC 应用程序的可移植性。
750 0
|
SQL Oracle 关系型数据库
PL/SQL --&gt; DML 触发器
--======================= -- PL/SQL --> DML 触发器 --=======================         何谓触发器?简言之,是一段命名的PL/SQL代码块,只不过该代码块在特定的条件下被触发并且执行。
1096 0