当前位置:网站首页 > 技术博客 > 正文

sqlserver 触发器



目录

一、触发器概述

二、触发器的特点

1、自动执行

2、与表关联

3、可以定义复杂逻辑

4、两种触发时间

5、六种触发事件

(1)BEFORE INSERT

(2)AFTER INSERT

(3)BEFORE UPDATE

(4)AFTER UPDATE

(5)BEFORE DELETE

(6)AFTER DELETE

三、触发器的创建

1、创建

2、解释

四、触发器的使用场景

1、数据验证

2、数据审计

3、数据完整性

4、自动计算字段

5、日志记录

五、完整的触发器示例

1、要求

2、建表

(1)customers 表结构

(2)orders 表结构

3、创建触发器

(1)触发器功能

(2)触发器语句

(3)触发器解释

六、触发器的限制和注意事项


        MySQL 的触发器(Triggers)是数据库管理系统(DBMS)中的一种功能,它允许用户定义在指定表上的某些操作(如 INSERT、UPDATE 或 DELETE)发生之前或之后自动执行的 SQL 语句或语句集。触发器是与表事件(例如,表的 INSERT、UPDATE 或 DELETE 操作)相关联的命名数据库对象。当在指定表上发生特定事件时,触发器会自动激活,并执行相应的 SQL 语句。如下图示,表示触发器的原理:

        当在表上执行指定操作时,触发器会自动激活。

        触发器与特定的表相关联,并且只能在该表上定义的触发事件上激活。

        触发器可以包含复杂的 SQL 语句,这些语句可以执行数据验证、更新其他表、发送电子邮件等。

        触发器可以在事件之前(BEFORE)或之后(AFTER)激活。

        INSERT、UPDATE(OF 列名)、DELETE。具体如下:

(1)BEFORE INSERT

        在插入操作之前触发。这种触发器在插入数据到表中之前执行,可以用于对即将插入的数据进行验证、修改或者阻止插入操作。

(2)AFTER INSERT

        在插入操作完成后触发。这种触发器在插入数据到表中之后执行,可以用于对新插入的数据进行额外处理,如更新其他表的数据、记录日志等。

(3)BEFORE UPDATE

        在更新操作之前触发。这种触发器在更新表中的数据之前执行,可以用于对即将更新的数据进行验证、修改或者阻止更新操作。

(4)AFTER UPDATE

        在更新操作完成后触发。这种触发器在更新表中的数据之后执行,可以用于对更新后的数据进行额外处理,如更新其他表的数据、记录日志等。

(5)BEFORE DELETE

        在删除操作之前触发。这种触发器在删除表中的数据之前执行,可以用于对即将删除的数据进行验证、修改或者阻止删除操作。

(6)AFTER DELETE

        在删除操作完成后触发。这种触发器在删除表中的数据之后执行,可以用于对删除后的数据进行额外处理,如更新其他表的数据、记录日志等。

        使用 CREATE TRIGGER 语句来创建触发器。下面是一个基本的触发器创建示例:

 

在这个示例中:

 trigger_name 是触发器的名称。

 BEFORE INSERT ON table_name 定义了触发器的触发时间和触发事件。

 FOR EACH ROW 表示触发器对受影响的每一行都会执行。

 BEGIN ... END; 之间的部分是触发器要执行的 SQL 语句。

        在插入或更新数据之前,触发器可以检查数据的有效性,并防止无效数据进入数据库。

        触发器可以记录对表的更改,以便稍后进行审计或跟踪。

        触发器可以确保数据的完整性,例如,通过在外键约束不可用时自动更新或删除相关表中的数据。

        触发器可以在插入或更新数据时自动计算并设置某些字段的值。

        触发器可以将表的更改记录到另一个表中,以便稍后进行查询或分析。

        写一个触发器,在orders表插入新记录后自动更新customers表中对应客户的总订单金额。

        假设有两个表:customers 和 orders,其定义如下:

(1)customers 表结构

        customers 表结构 如下:

 

(2)orders 表结构

        orders 表结构可能如下:

 

(1)触发器功能

        要创建一个触发器,当在orders表中插入新订单时,自动更新customers表中对应客户的total_orders_amount字段。

(2)触发器语句

        以下是创建该触发器的SQL语句:

 

(3)触发器解释

- DELIMITER // 和 DELIMITER ; 用于更改命令提示符,以便在触发器定义中使用多个语句。

- AFTER INSERT ON orders 指定触发器在orders表插入新记录后激活。

- FOR EACH ROW 表示对插入的每一行都会执行触发器中的语句。

- NEW.order_amount 和 NEW.customer_id 是在orders表中新插入的行中的值。

- 触发器中的UPDATE语句用于更新customers表中对应客户的total_orders_amount字段。

        总的执行结果是:每当在orders表中插入一个新订单时,该触发器都会自动更新customers表中对应客户的总订单金额。

 1、触发器不能由 SQL 语句直接调用,它们只能由触发事件激活。

 2、触发器中不能包含对数据表本身的 UPDATE 或 DELETE 操作(但可以对其他表执行这些操作)。

 3、触发器中的 SQL 语句必须是有效的,并且不能包含任何导致错误或异常的语句。

 4、触发器可能会增加数据库的复杂性,并可能导致性能问题,因此在使用触发器时需要谨慎考虑。


文章正下方可以看到我的联系方式:鼠标“点击” 下面的 “威迪斯特-就是video system 微信名片”字样,就会出现我的二维码,欢迎沟通探讨。


版权声明


相关文章:

  • 哈夫曼树是最优二叉树吗2025-01-11 07:01:02
  • 高并发怎么处理2025-01-11 07:01:02
  • 引用类型和基本数据类型有什么区别2025-01-11 07:01:02
  • 位图索引原理2025-01-11 07:01:02
  • java中内部类的定义2025-01-11 07:01:02
  • redis集群模式原理2025-01-11 07:01:02
  • 组策略gpedit.msc2025-01-11 07:01:02
  • java课程设计总结与思考2025-01-11 07:01:02
  • socks5代理服务器搭建2025-01-11 07:01:02
  • 玄幻:开局获得机缘抢夺系统2025-01-11 07:01:02