数据库触发器trigger 的应用

文章目录

  • 1. 什么是触发器(trigger)?
  • 2. 触发器的种类
    • 2.1 DML 触发器
    • 2.2 DDL 触发器
    • 2.3 登录触发器
  • 3. 触发器的优点
  • 4. 触发器的缺点
  • 5. 应用示例
    • 5.1 触发器的创建
    • 5.2 删除触发器

1. 什么是触发器(trigger)?

在某种操作执行的同时触发另一种操作。它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。
比如有一张学生信息表,还有一张学生计数表,只要学生信息表添加一条信息,学生计数表就加1。

2. 触发器的种类

2.1 DML 触发器

DML (Data Manipulation Language,数据操作语言) 触发器是当数据库服务器中发生数据操作语言事件时执行的触发器。DML触发器又可以分为三种:

  • 插入触发器 (insert) :在向表中插入数据时被触发。
  • 更新触发器 (update) :在修改表中数据时被触发。
  • 删除触发器 (delete) :从表中删除数据时被触发。

INSTEAD OF 触发器
这种触发器在数据修改操作之前触发,可以用来替换实际的数据修改操作。
此类触发器既可定义在表上,也可定义在视图上。
例如,对于DELETE 操作,如果我们期望只修改数据状态来标示数据已被删除而不是将数据从表中删除,那么我们可以使用INSTEAD OF 触发器来实现。
AFTER 触发器
这种触发器在实际操作完成后触发,可以用来执行后续操作。
此类触发器只能定义在表上,不能创建在视图上。
例如,如果我们期望在删除数据后在其他表记录删除操作的发生时间,那么我们可以使用AFTER 触发器来实现。
CLR 触发器
它允许在.NET Framework 中编写的代码在SQL Server 中执行。
CLR 触发器可以与DML 触发器和DDL 触发器一起使用,以在数据库中自动执行操作。
CLR触发器具有以下特点:
可访问性:CLR触发器可以使用C#或VB.NET等.NET语言编写,并且可以在SQL Server中直接执行。
扩展性:CLR触发器可以执行复杂的功能,包括数据验证、数据转换、日志记录等。
安全性:CLR触发器需要具有适当的权限才能在SQL Server中执行。
调试和部署:CLR触发器可以使用Visual Studio进行开发和调试,并且可以像其他.NET程序一样进行部署和维护。
CLR触发器的创建和使用需要具备.NET编程和SQL Server管理技能。在创建CLR触发器时,需要定义触发器的类型(AFTER或INSTEAD OF)、触发事件(INSERT、UPDATE或DELETE)以及要执行的.NET代码。然后,可以将CLR触发器附加到特定的表或视图上,以便在满足触发条件时自动执行相应的操作。

2.2 DDL 触发器

DDL (Data Definition Language,数据定义语言) 触发器是当服务器或数据库中发生数据定义语言事件时被激活使用的触发器。DDL触发器主要用于防止对数据架构进行的某些更改或记录数据中的更改或事件操作。

  • create
  • alter
  • drop

2.3 登录触发器

登录触发器是当用户登录到SQL Server 实例时触发的触发器。它可以用于执行特定于用户登录的操作,例如记录审计日志或执行安全策略。

3. 触发器的优点

① 强制数据完整性
触发器可以在数据修改前后进行操作,确保数据的完整性。例如,在插入、更新或删除记录之前,可以检查某些条件是否满足。
② 实现复杂的业务规则
触发器可以用于实现复杂的业务规则,并在数据变更时自动执行。这可以减少应用程序中的逻辑复杂性。
③ 自动执行
触发器是自动执行的,这意味着当满足特定条件时,无需手动干预即可执行操作。
④ 级联操作
触发器可以检测数据库内的操作,并自动级联影响整个数据库的各项内容。
⑤ 嵌套调用
触发器可以调用一个或多个存储过程,这使得代码更加模块化和可重用。

4. 触发器的缺点

① 可移植性差
触发器是数据库特定的,这意味着从一个数据库系统迁移到另一个数据库系统时,可能无法直接使用触发器。
② 占用服务器资源
触发器在服务器上运行,可能会对服务器性能产生影响,尤其是在高并发的系统中。
③ 执行速度
触发器的执行速度可能会受到触发器代码的复杂性和数据库服务器性能的影响。
④ 嵌套调用的问题
如果触发器中的嵌套调用出现问题,可能会导致数据不一致,后期维护也较为不便。

5. 应用示例

5.1 触发器的创建

假设有一张学生成绩表 StudentInfo ,这张表进行了更新,插入和删除操作时,将这些操作数据备份到 SudentInfo_Backup 表中

--建表
if object_id('StudentInfo','u') is not null drop table StudentInfo
go
create table StudentInfo(Student_ID  INT,Student_Name  varchar(20),Course      varchar(20),Score       int
)
go
insert into StudentInfo
values(1,'Jane','语文',90)
,(1,'Jane','数学',85)
,(2,'Bob','体育',78)
,(2,'Bob','英语',89)
,(3,'Wendy','数学',99)
go
if object_id('StudentInfo_Backup','u') is not null drop table StudentInfo_Backup
go
create table StudentInfo_Backup(Student_ID  INT,Student_Name  varchar(20),Course      varchar(20),Score       int,Operation  varchar(20),BackupTime   datetime
)
goalter trigger [dbo].[Tri_StudentInfo_backup]
on [dbo].[StudentInfo]
for insert,update,delete
asdeclare @Time datetime = getdate()insert into StudentInfo_Backup (Student_ID,Student_Name,Course ,Score ,Operation,BackupTime)
select Student_ID,Student_Name,Course ,Score,'Update',@Time
from Inserted a
where exists (select 1 from Deleted bwhere a.Student_ID= b.Student_ID and a.Course = b.Course
)insert into StudentInfo_Backup(Student_ID,Student_Name,Course ,Score ,Operation,BackupTime)
select Student_ID,Student_Name,Course ,Score,'Insert',@Time from Inserted a
where not exists (select 1 from Deleted bwhere a.Student_ID= b.Student_ID and a.Course = b.Course
)insert into StudentInfo_Backup (Student_ID,Student_Name,Course ,Score,Operation,BackupTime)
select Student_ID,Student_Name,Course ,Score,'Delete',@Time from Deleted a
where not exists (select 1 from Inserted bwhere a.Student_ID= b.Student_ID and a.Course = b.Course
)

5.2 删除触发器

DROP TRIGGER Tri_StudentInfo_backup

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/591342.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跨境电商代采是什么?怎么做代采网站?

跨境电商独立站就是跨境电商自行搭建的销售网站,服务器、域名都是自主购买的,并由跨境电商独立运营与营销推广。 近些年来,各类第三方电商平台虽然流量大,但是随着进驻电商数量的增加,流量竞争也愈发激烈,…

关于图片复制出现拒绝访问的问题探讨

最近看到一个个bug一个图片无法实现复制,代码是这样的 package demo.demo18.Test; import java.io.*; public class test1 { public static void main(String[] args) throws IOException { try ( //需求:复制照片 //1.创建一个字节输入流管道与源文件接…

雷达遮挡检测综述

1 概述 雷达(毫米波、激光)的遮挡是实际项目中比较常见的现象,优秀的算法应当能够及时、准确地检测出雷达是否被遮挡,以及遮挡的严重程度,然后将故障信息发送给诊断系统,并在仪表盘上显示,如…

WiFi7: EMLSR操作之一 -- 概述

原文:EMLSR操作能够允许非AP MLD使用一个或以上的link侦听初始控制帧,该控制帧由AP MLD以non-HT(dup)格式发送,并在接下来在同一Link进行帧交换。 非AP MLD在处于EMLSR模式时受EMLSR模式限制。 AP MLD在dot11EHTEMLSROptionActi…

每天刷两道题——第四天

1.1最大子数组和 给一个整数数组 nums ,找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 输入:nums [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,1] 的…

win系统微软输入法踩坑之输入法

例如:字母间距变宽 或者打字总是繁体等等 字母变宽是因为快捷键误触切换成了全角字符。。 立马打开输入法设置界面进行相关设置(你要解决的输入法问题都可以在这里得到解决):

LED恒流驱动芯片:700V高压线性恒流选型一览表

LED恒流驱动芯片是一种专门用于LED照明产品的电子元件,它能够实现LED的恒流驱动,从而保证LED灯具在工作过程中稳定的亮度和电流输出。其中,700V高压线性恒流是LED恒流驱动芯片的一个重要特性,下面就让我们来详细了解一下。 SM2253…

Apple Unity Plugins 接入GameCenter 崩溃解决方案

目录 问题问题原因解决方案可直接使用的UnityPlugins 问题 调用 GKLocalPlayer.Local.FetchItems() 程序崩溃,报错:Thread 1: EXC_BAD_ACCESS (code257, address0x8000000000000002) 启动崩溃,报错:Library not loaded: rpath/Ap…

RSA非对称加密学习

设计方案: 单位生成密钥对: 每个单位(A、B、C、D等)生成自己的 RSA 密钥对,包括一个私钥和一个对应的公钥。 A单位加密数据: 单位A作为数据加密方,使用其他单位的公钥对数据进行加密。 其他单…

新年新计划,羊大师教你如何实现个人目标与成长

新年新计划,羊大师教你如何实现个人目标与成长 新的一年已经到来,这是一个神奇的时刻,一个全新的开始,也是实现自己目标与成长的最佳时机。在这个瞬息万变的世界中,我们总是被忙碌的生活所迷失,然而我们需…

Reservoir sampling algorithm--蓄水池抽样算法的理解

一、算法代码: def reservoir(num_seen_examples: int, buffer_size: int) -> int:"""Reservoir sampling algorithm.:param num_seen_examples: the number of seen examples:param buffer_size: the maximum buffer size:return: the target i…

springboot/spring cloud 手动控制事务提交

1、背景:定时器定时从数据库中拉取数据进行分组处理,每一组如果有任意一个异常导致失败,该组操作事务只能回滚。所以在循环中每一次大循环是一个事务,大循环中的其它小循环中任意一个异常都会回滚处理。 2、service中引入spring的…

2023年度回顾:怿星科技的转型与创新

岁月不居,时节如流。随着2023年的落幕,怿星科技在这一年中不仅实现了自身的转型,还在技术创新、产品研发、行业合作和人才培养等方面取得了显著的成就。这一年,怿星科技正式完成了从服务型公司向产品型公司的战略转变,…

Delphi6函数大全5-SysUtils.pas

Delphi6函数大全5-SysUtils.pas 首部 function InquireSignal(RtlSigNum: Integer): TSignalState; $[SysUtils.pas 功能 <NULL> 说明 Kylix函数 参考 <NULL> 例子 <NULL> ━━━━━━━━━━━━━━━━━━━━━ 首部 procedure A…

为什么选择 IBM LSF?

IBM Spectrum Computing 推出了全面的软件定义基础架构解 决方案产品组合&#xff0c;从而优化资源利用率以缩短成果实现时间并 降低成本&#xff0c;以高效地交付 IT 服务。IBM Spectrum Computing 解决方案非常适合技术和 HPC 应用&#xff0c;旨在简化和加速高性能 仿真和分…

Windows本地如何部署Apache服务器搭配内网穿透实现无公网IP远程访问?

文章目录 前言1.Apache服务安装配置1.1 进入官网下载安装包1.2 Apache服务配置 2.安装cpolar内网穿透2.1 注册cpolar账号2.2 下载cpolar客户端 3. 获取远程桌面公网地址3.1 登录cpolar web ui管理界面3.2 创建公网地址 4. 固定公网地址 前言 Apache作为全球使用较高的Web服务器…

【Kotlin】协程

Kotlin协程 背景定义实践GlobalScope.launchrunBlocking业务实践 背景 在项目实践过程中&#xff0c;笔者发现很多异步或者耗时的操作&#xff0c;都使用了Kotlin中的协程&#xff0c;所以特地研究了一番。 定义 关于协程&#xff08;Coroutine&#xff09;&#xff0c;其实…

深度学习|3.6 激活函数 3.7 为什么需要非线性激活函数

激活函数 主要有sigmoid函数、tanh函数、relu函数和leaky relu函数 tanh函数相比sigmoid函数是具有优势的&#xff0c;因为tanh函数使得输出值的平均值为0&#xff0c;而sigmoid函数使得输出值的平均值为1/2&#xff0c;对下一层来说tanh输出的0更好进行处理。 激活函数tanh…

# .NET Framework中使用命名管道进行进程间通信

.NET Framework中使用命名管道进行进程间通信 在.NET应用程序中&#xff0c;进程间通信&#xff08;IPC&#xff09;是一项常见需求。命名管道提供了一种高效、可靠的方式来在独立运行的进程之间传输数据。本文将展示如何在.NET Framework环境下创建一个WinForms管道客户端应用…

DIA数皆智能客户体验管理CEM获伊利“健康+AI”生态创新大奖

DIA数皆智能客户体验管理CEM获伊利“健康AI”生态创新大奖 数皆智能再获殊荣&#xff01; 北京&#xff0c;2023年12月26日 — 在全球瞩目的伊利集团“健康AI”生态创新大赛中&#xff0c;上海数皆智能技术有限公司大放异彩&#xff0c;其创新领先的“智能化客户体验管理CEM&a…