当前位置: 首页 > article >正文

Microsoft Sql Server 2019 触发器

触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表 事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当 对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整 性约束和业务规则等。

触发器分类

1. DML触发器

2. DDL触发器

3. 登录触发器

DML触发器

DML触发器是一些附加在特定表或视图上的操作代码,当数据库服务器中发生数据操作语言事件时执 行这些操作。SqlServer中的DML触发器有三种:

1. Insert触发器: 向表中插入数据时被触发。

Insert 触发器:

在向目标表中插入数据后,会触发该表的Insert 触发器,系统自动在内存中创建inserted表; 如 果不满足判断数据会进行回滚,插入的数据操作会失败。

USE [LearnEdu]
GO
 
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO 
ALTER TRIGGER [dbo].[Trigger_CompanyInsert]
   ON   [dbo].[Company]
   AFTER INSERT
AS 
BEGIN 
 SET NOCOUNT ON;
 
 Declare @name varchar(50);
 Select @name=[Name] From inserted
 
 IF(@name='教育')
 Begin
 Insert into CompanyNew([Name]
 ,[CreateTime]
 ,[CreatorId]
,[LastModifierId]
 ,[LastModifyTime])
 Select [Name]
 ,[CreateTime]
 ,[CreatorId]
 ,[LastModifierId]
 ,[LastModifyTime] 
 From inserted
 End
 --ELSE
 -- Begin
 --   print('不添加')
 -- rollback transaction     --数据回滚
 -- END 
END

2. delete触发器:从表中删除数据时被触发。

Delete 触发器:

在向目标表中删除数据后,会触发该表的Delete 触发器,系统自动在内存中创建deleted表, deleted表存放的是删除的数据。

USE [LearnEdu]
GO
 
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--Delete 触发器
ALTER TRIGGER [dbo].[Trigger_CompanyDelete]
   ON [dbo].[Company]
   AFTER DELETE
AS 
BEGIN
 SET NOCOUNT ON;
 Declare @name varchar(50);
 select @name=[Name] from Deleted; 
 Delete CompanyNew where [Name]=@name
      
END

3. update触发器:修改表中数据时被触发。

Update 触发器:

在向目标表中更新数据后,会触发该表的Update 触发器,系统自动在内存中创建deleted表和 inserted表,deleted表存放的是更新前的数据,inserted表存放的是更新的数据。

USE [LearnEdu]
GO
 
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO
--Update 触发器
ALTER TRIGGER [dbo].[Trigger_CompanyUpdate]
   ON [dbo].[Company]
   AFTER UPDATE
AS 
BEGIN 
 SET NOCOUNT ON; 
 Declare @name varchar(50);
 select @name=[Name] from Deleted;
 Delete CompanyNew where [Name]=@name; 
 Insert into CompanyNew([Name]
 ,[CreateTime]
 ,[CreatorId]
 ,[LastModifierId]
 ,[LastModifyTime])
 Select [Name]
 ,[CreateTime]
 ,[CreatorId]
 ,[LastModifierId]
 ,[LastModifyTime] 
 From inserted
END

当遇到下列情形时,应考虑使用DML触发器:

  • 1. 通过数据库中的相关表实现级联更改。
  • 2. 防止恶意或者错误的insert、update和delete操作,并强制执行check约束定义的限制更为复杂 的其他限制。
  • 3. 评估数据修改前后表的状态,并根据该差异才去措施。

DDL触发器

DDL触发器(数据定义语言,Data Definition Language)

DDL触发器是当服务器或者数据库中发生数据定义语言(主要是以create,drop,alter开头的语句)事件时 被激活使用,使用DDL触发器可以防止对数据架构进行的某些更改或记录数据中的更改或事件操作。

登录触发器

登录触发器将为响应 LOGIN 事件而激发存储过程。与 SQL Server 实例建立用户会话时将引发此事 件。登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前激发。因此,来自触发器内 部且通常将到达用户的所有消息(例如错误消息和来自 PRINT 语句的消息)会传送到 SQL Server 错 误日志。如果身份验证失败,将不激发登录触发器。

触发器优缺点:

  • 1、强化约束:强制符合业务的规则和要求,能实现比check语句更为复杂的约束。
  • 2、跟踪变化:触发器可以侦测数据库内的操作,从而禁止数据库中未经许可的更新和变化。
  • 3、级联运行:侦测数据库内的操作时,可自动地级联影响整个数据库的各项内容。
  • 4、嵌套调用:触发器可以调用一个或多个存储过程。触发器最多可以嵌套32层。
  • 5、可移植性差。
  • 6、占用服务器资源,给服务器造成压力。
  • 7、执行速度主要取决于数据库服务器的性能与触发器代码的复杂程度。
  • 8、嵌套调用一旦出现问题,排错困难,而且数据容易造成不一致,后期维护不方便。

使用建议

  • 1、尽量避免在触发器中执行耗时操作,因为触发器会与SQL语句认为在同一事务中,事务不结束,就 无法释放锁。
  • 2、避免在触发器中做复杂操作,影响触发器性能的因素比较多(Eg:产品版本,所使用的架构等),要 想编写高效的触发器考虑因素比较多,编写高性能触发器还是很难的。
  • 3、触发器编写时注意多行触发时的处理。(一般不建议使用游标)


http://www.kler.cn/a/504631.html

相关文章:

  • 浅谈云计算07 | 云安全机制
  • 【SH】Xiaomi9刷Windows10系统研发记录 、手机刷Windows系统教程、小米9重装win10系统
  • C#异步和多线程,Thread,Task和async/await关键字--12
  • PyTorch 中的 Dropout 解析
  • Level2逐笔成交逐笔委托毫秒记录:今日分享优质股票数据20250114
  • ORACLE-表空间和分区控制
  • 利用 rclone 挂载华为云 OBS 到本地
  • 图-岛屿-dfs
  • 什么是docker?关于docker容器的全面详细介绍
  • Spring MVC流程一张图理解
  • 获取文章列表功能
  • LeetCode热题100-有效的括号【JavaScript讲解】
  • 常见好用的PHP CMS开源系统有哪些?
  • javaEE-网络原理-IP协议
  • 微信小程序实现个人中心页面
  • Ubuntu磁盘空间不足或配置错误时,如何操作扩容?
  • Starrocks 存算分离 VS Trino 性能测试
  • 银河麒麟V10安装第二个nginx服务
  • Unity 自定义批量打包工具
  • TCP、UDP的区别及使用场景
  • 装备制造业:建立项目“四算”管理:以合同为源头,以项目为手段实现合同的测算、预算、核算与决算的管控体系
  • [云讷科技] 用于软件验证的仿真环境
  • flow-matching based TTS : VoiceBox, E2-TTS, maskGCT
  • 数据结构与算法之栈: LeetCode 1047. 删除字符串中的所有相邻重复项 (Ts版)
  • JVM 核心知识点总结
  • springboot使用阿里oss实现文件上传