Microsoft Sql Server 2019 触发器

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

触发器分类

  1. DML触发器

  2. DDL触发器

  3. 登录触发器

DML触发器

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

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

Insert 触发器:

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

sql 复制代码
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
  1. delete触发器:从表中删除数据时被触发。

Delete 触发器:

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

sql 复制代码
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
  1. update触发器:修改表中数据时被触发。

Update 触发器:

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

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

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、触发器编写时注意多行触发时的处理。(一般不建议使用游标)
相关推荐
PXM的算法星球24 分钟前
数据库分库分表实战指南:从原理到落地
数据库
我科绝伦(Huanhuan Zhou)34 分钟前
Redis再次开源!reids8.0.0一键安装脚本分享
数据库·redis·开源
Kookoos1 小时前
基于 PostgreSQL 的 ABP vNext + ShardingCore 分库分表实战
数据库·docker·postgresql·c#·.net
czhc11400756631 小时前
Linux511SSH连接 禁止root登录 服务任务解决方案 scp Vmware三种模式回顾
运维·服务器·数据库
码农黛兮_462 小时前
数据库备份与策略【全量备份、增量备份、日志恢复】
数据库
向哆哆2 小时前
Hibernate 性能优化:告别慢查询,提升数据库访问性能
java·数据库·性能优化·hibernate
小Tomkk2 小时前
2025年5月15日前 免费考试了! Oracle AI 矢量搜索专业认证
数据库·人工智能·oracle
菲兹园长2 小时前
MySql(基础)
数据库·mysql·oracle
liuhongJAVAEn2 小时前
分布式-Redis分布式锁
数据库·redis·分布式
南棱笑笑生3 小时前
20250510解决NanoPi NEO core开发板在Ubuntu core22.04.3系统下适配移远的4G模块EC200A-CN的问题
数据库·postgresql