触发器以及事前触发和事后触发,语句级触发和行级触发

本文介绍了触发器的概念、分类及应用场景,重点讲述了DML触发器和DDL触发器的区别,以及事前触发与事后触发的不同之处。同时,还讨论了触发器在确保数据一致性和完整性方面的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、触发器概念

触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。触发器主要是通过事件(增、删、改)进行触发被自动调用执行的。而存储过程可以通过存储过程的名称被调用。

触发器是在对表进行增、删、改时,自动执行的存储过程。触发器常用于强制业务规则,它是一种高级约束,通过事件进行触发而被执行。

二、触发器分类

SQL Server 包括两种常规类型的触发器:数据操作语言 (DML) 触发器数据定义语言 (DDL) 触发器

当INSERT、UPDATE 或 DELETE 语句修改指定表或视图中的数据时,可以使用 DML 触发器。 DDL 触发器激发存储过程以响应各种 DDL 语句,这些语句主要以CREATE、ALTER 和 DROP 开头。 DDL 触发器可用于管理任务,例如审核和控制数据库操作。

通常说的触发器就是DML触发器。

1、DML触发器分为:

(1) after触发器(事后触发)

    a、 insert触发器
    b、 update触发器
    c、 delete触发器 

(2) instead of 触发器 (事前触发)

注:after触发器要求只有执行某一操作**insert、update、delete之后触发器才被触发,且只能定义在表上。而**instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。既可以在表上定义instead of触发器,也可以在视图上定义。

2、DDL 触发器使用场合:

(1)要防止对数据库架构进行某些更改。

(2)希望数据库中发生某种情况以响应数据库架构中的更改。

(3)要记录数据库架构中的更改或事件。

三、使用触发器的时机

1、实现主外键关系所不能保证的复杂参照完整性数据的一致性
不过,通过“级联引用完整性约束”可以更有效地执行这些更改。

2、防止恶意或错误的 INSERT、UPDATE 以及 DELETE 操作,并强制执行比 CHECK 约束定义的限制更为复杂的其他限制。
与 CHECK 约束不同(check约束只能引用自身表中的列),DML触发器可以引用其他表中的列;
触发器可以完成所有约束的功能,但不一定是最佳方案;
触发器能够使用自定义信息和较为复杂的错误处理;

3、DML 触发器可以评估数据修改前后表的状态,并根据该差异采取措施。

4、一个表中的同一个修改语句的DML触发器允许被多个不同的操作(INSERT、UPDATE 或 DELETE)来响应;

四、实例

触发器分为事前触发和事后触发,这两种触发有何区别?语句级触发和行级触发有何区别?

答:事前触发器运行于触发事件发生之前,而事后触发器运行于触发事件发生之后。通常事前触发器可以获取事件之前和新的字段值。
语句级触发器可以在语句执行前或后执行,而行级触发在触发器所影响的每一行触发一次。

分析:简单而言,事前触发主要是验证一些条件或进行一些准备工作,在表保存之前就触发,而事后触发则是进行收尾工作,保证事务的完整性,在表经过修改以后才触发。行级触发器是对DML语句影响的每个行执行一次,如UPDATE语句影响多行,就会对每行都激活一次触发器。而语句级触发器是对每个DML语句执行一次,如INSERT语句在表中即使插入了100多行,表上的INSERT语句级触发器也只会执行一次。

### 语句级触发器触发器的区别详解 语句级触发器触发器是数据库触发器的两种主要类型,它们的主要区别在于触发时机以及触发频率的不同。以下是两者的详细对比: 1. **触发时机** - 触发器在执触发事件时,针对受影响的每一数据都会激活一次触发器[^1]。这意味着如果一个DML语句(如`INSERT`、`UPDATE`或`DELETE`)影响了多数据,则每数据都会单独触发一次触发器。 - 语句级触发器则是在整个SQL语句操作完成后触发一次[^1]。无论该语句影响了多少数据,语句级触发器只会在操作结束时触发一次。 2. **适用场景** - 触发器适用于需要对每一数据进单独处理的情况。例如,在更新某一数据时,可能需要检查该是否满足某些特定条件,或者记录该的历史变更信息[^2]。 - 语句级触发器适用于不需要逐处理的场景。例如,统计某个表中被修改的总数,或者在批量插入数据后执某些全局操作[^1]。 3. **性能差异** - 触发器由于每次操作都需要为每一数据单独执触发逻辑,因此在处理大量数据时可能会带来较大的性能开销[^2]。 - 语句级触发器仅在操作结束后执一次,因此通常具有更高的性能效率[^1]。 4. **使用限制** - 在触发器中,可以通过`:OLD``:NEW`伪记录访问受影响的旧值新值[^1]。这使得触发器非常适合用于比较前后数据差异的场景。 - 语句级触发器无法直接访问单数据的旧值新值,因为它只在语句级别上工作。 5. **触发约束条件** - 触发器支持使用`WHEN`子句定义触发约束条件,只有当条件满足时才会激活触发器[^1]。 - 语句级触发器不支持`WHEN`子句,因此它会在每次触发事件发生时无条件地执[^1]。 ### 示例代码 以下是一个简单的示例,展示如何在MySQL中创建触发器语句级触发器: #### 触发器 ```sql CREATE TRIGGER before_update_row_level BEFORE UPDATE ON employees FOR EACH ROW BEGIN IF NEW.salary < 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Salary cannot be negative'; END IF; END; ``` #### 语句级触发器 ```sql CREATE TRIGGER after_insert_statement_level AFTER INSERT ON employees FOR EACH STATEMENT BEGIN UPDATE statistics SET total_employees = total_employees + ROW_COUNT(); END; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值