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、触发器编写时注意多行触发时的处理。(一般不建议使用游标)
相关推荐
山猪打不过家猪4 小时前
ASP.NET Core Clean Architecture
java·数据库·asp.net
qwy7152292581634 小时前
13-R数据重塑
服务器·数据库·r语言
Bio Coder4 小时前
R语言安装生物信息数据库包
开发语言·数据库·r语言
钊兵5 小时前
数据库驱动免费下载(Oracle、Mysql、达梦、Postgresql)
数据库·mysql·postgresql·oracle·达梦·驱动
weixin_425878236 小时前
Redis复制性能优化利器:深入解析replica-lazy-flush参数
数据库·redis·性能优化
左灯右行的爱情6 小时前
Redis数据结构总结-listPack
数据结构·数据库·redis
隔壁老王1567 小时前
mysql实时同步到es
数据库·mysql·elasticsearch
想要打 Acm 的小周同学呀7 小时前
Redis三剑客解决方案
数据库·redis·缓存
rkmhr_sef7 小时前
Redis 下载与安装 教程 windows版
数据库·windows·redis