008 数据库对象—触发器—讲解

2024-09-01 16:32

本文主要是介绍008 数据库对象—触发器—讲解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

触发器看的我一知半解,看到师兄的一篇触发器的博客特别好,看完以后觉得茅塞顿开,我这个闷葫芦终于也开窍了!先跟大家分享一下这犀利的好文章,其后是我个人的一下补充和思维导图。

分享:

触发器简介

触发器(trigger)是种特殊的存储过程,它的执行不是由程序调用,也不需要手动操作,它是由事件来触发,事件大家应该非常熟悉吧,比如按钮的Click事件、网页的Load事件等。按钮的Click事件是通过鼠标单击按钮触发的,而触发器的事件,是由对表进行增删改操作所触发的。当对一个数据库或表进行增删改( Insert,Delete,Update)的时就会激活触发器。

从SQL2005开始,根据SQL语句的不同将触发器分成了两类,一类是DML(数据操纵)触发器,一类是DDL(数据定义)触发器。其中DML触发器又分为两类:After触发器和Instead Of触发器。

 

触发器的分类

DML触发器:DML(Data Manipulation Language)触发器是当数据库服务器中发生数据操作语言事件时执行的存储过程。DML触发器又分为两类:After触发器和Instead Of触发器

DDL触发器:DDL触发器是在响应数据定义语言(Data Definition Language)事件时执行的存储过程。DDL触发器一般用于执行数据库中管理任务。如审核和规范数据库操作、防止数据库表结构被修改等。

DML触发器:

今天我们我们主要介绍DML触发器,DML触发器分为After触发器和Instead Of触发器。

After触发器:这类触发器是在记录已经改变完之后(after),才会被激活执行,它主要是用于记录变更后的处理或检查,一旦发现错误,也可以用Rollback Transaction语句来回滚本次的操作。

Instead Of触发器:这类触发器一般是用来取代原本的操作,在记录变更之前发生的,它并不去执行原来SQL语句里的操作(Insert、Update、Delete),而去执行触发器本身所定义的操作。

在SQL Server里,每个DML触发器都分配有两个特殊的表,

一个是Inserted表,一个是Deleted表。它们两个存在于数据库服务器的内存中,是由系统管理的逻辑表,是两个临时表,而不是真正存储在数据库中的物理表。用户对这两个表只有读取的权限,没有修改的权限。

这两个表的结构(主外键、字段、数据类型等)与触发器所在数据表的结构是完全一致的,当触发器的工作完成之后,这两个表也将会从内存中删除。

Inserted和Deleted两个表的作用:

Inserted:对于插入记录操作来说,插入表里存放的是要插入的数据;对于更新记录操作来说,插入表里存放的是要更新的记录。

       Inserted临时表就是临时存储插入的数据或者要更新的数据

Deleted:对于更新记录操作来说,删除表里存放的是被更新记录;对于删除记录操作来说,删除表里存入的是被删除的旧记录。

      Deleted:临时表就是临时存储删除的数据

看上面两句话可能不太明白,那么看看下面这张表是不是就明白了?

 

工作原理:  

After触发器的工作原理: 

After触发器是在SQL语句执行之后才被激活的。以删除记录为例:当SQL Server接收到一条删除操作的SQL语句时,SQL Server先将要删除的记录存放在Deleted表里,然后把数据表里的记录删除,再激活After触发器,执行After触发器里的SQL语句。执行完毕之后,删除内存中的Deleted表,操作结束。

还是举上面的例子:在产品库存表里,如果要删除一条产品记录,在删除的时候,触发器可以检查该产品库存数量是否为零,如果不为零则取消删除操作。数据库的操作如下:

1,接收SQL语句,将要从产品库存表里删除的产品记录取出来,放在删除表里。

2,从产品库存表里删除该产品记录。

3,从删除表里读出该产品的库存数量字段,判断是不是为零,如果为零的话,完成操作,从内存里清除删除表;如果不为零的话,用Rollback Transaction语句来回滚操作(即将库存表还原成删除之前的状态)。

 

Instead Of 触发器的工作原理

Instead Of触发器与After触发器不同。After触发器是在Insert、Update和Delete操作完成后才激活的,而Instead Of触发器,是在这些操作进行之前就激活了,并且不再去执行原来的SQL操作,而是用触发器本身的SQL语句代替原来的语句去执行。


举例说明:

还拿上面那个例子来说,删除一条产品记录的时候,用Instead Of将删除操作替换成查询该产品的库存。数据库的操作如下:

1,接收SQL语句,但不执行,而是跳转到Instead Of后面的SQL语句

2,根据传入的产品ID,将该产品的库存取出,完成操作。

语法:

REATE TRIGGER <Trigger_Name>

   ON  < Table_Name>

   AFTER|instead of < INSERT,DELETE,UPDATE>

AS

BEGIN

sql语句

END

GO

 

注意事项

1,After触发器只能用于数据表不能用于视图;Instead Of触发器两者皆可,设置为With Check Option的视图也不允许建立Instead Of触发器。两种触发器都不可以建立在临时表上。

2,一个数据表可以有多个触发器,但是一个触发器只能对应一个表。

3,在同一个数据表中,对每个操作(如Insert、Update、Delete)而言可以建立许多个After触发器,而Instead Of触发器针对每个操作只有建立一个。

4,如果针对某个操作即设置了After触发器又设置了Instead Of触发器,那么Instead of触发器一定会激活,而After触发器就不一定会激活。

5,不同的SQL语句,可以触发同一个触发器,如Insert和Update语句都可以激活同一个触发器。

6,触发器名在所在的数据库里必须是唯一的。由于触发器是建立中数据表或视图中的,所以有很多人都以为只要是在不同的数据表中,触发器的名称就可以相同,其实触发器的全名(Server.Database.Owner.TriggerName)是必须唯一的,这与触发器在哪个数据表或视图无关。

7,关键字AFTER可以用For来代取,它们的意思都是一样的,代表只有在数据表的操作都已正确完成后才会激活的触发器。

 

 

个人理解:

补充一点:after触发器就是在事件发生之后进行检查确认

               而instead of 就是在事件发生之前进行替换操作。

DDL触发器也分为两类:数据库级别和服务器级别。

附上一种思维导图帮助消化。

 

这篇关于008 数据库对象—触发器—讲解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1127464

相关文章

Java中对象的创建和销毁过程详析

《Java中对象的创建和销毁过程详析》:本文主要介绍Java中对象的创建和销毁过程,对象的创建过程包括类加载检查、内存分配、初始化零值内存、设置对象头和执行init方法,对象的销毁过程由垃圾回收机... 目录前言对象的创建过程1. 类加载检查2China编程. 分配内存3. 初始化零值4. 设置对象头5. 执行

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

查询SQL Server数据库服务器IP地址的多种有效方法

《查询SQLServer数据库服务器IP地址的多种有效方法》作为数据库管理员或开发人员,了解如何查询SQLServer数据库服务器的IP地址是一项重要技能,本文将介绍几种简单而有效的方法,帮助你轻松... 目录使用T-SQL查询方法1:使用系统函数方法2:使用系统视图使用SQL Server Configu

SQL Server数据库迁移到MySQL的完整指南

《SQLServer数据库迁移到MySQL的完整指南》在企业应用开发中,数据库迁移是一个常见的需求,随着业务的发展,企业可能会从SQLServer转向MySQL,原因可能是成本、性能、跨平台兼容性等... 目录一、迁移前的准备工作1.1 确定迁移范围1.2 评估兼容性1.3 备份数据二、迁移工具的选择2.1

Python中连接不同数据库的方法总结

《Python中连接不同数据库的方法总结》在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言,下面我们就来看看如何使用Python实现连接常用的几... 目录一、连接mysql数据库二、连接PostgreSQL数据库三、连接SQLite数据库四、连接Mo