SQL server触发器学习记录

时间:2024-04-11 08:35:11

作为C#程序员,我工作内容基本就是winform,wpf,asp.net。sql接触的比较少,今天突然来了一个ticket要我修改触发器脚本....只会select*的我顿感迷茫。。。

需求描述:aspnet_Users表有三个触发器INSERT,DELETE,UPDATE,每个触发器的执行结果都是对表:aspnet_UsersAuditing 执行insert操作。结果就是aspnet_UsersAuditing的数据量增长的特别快、导致备份失败。

现在需要更改触发器的条件:

The trigger on this table should ignore updates if only LastActivityDate changed.

也就是说,当只有字段:LastActivityDate 发生变化时,不需要执行触发器。

解决过程:

下图是目前的UPDATE触发器sql。根据需求,我认为需要修改的只有UPDATE触发器,因为insert和delete并不会引起only  LastActivityDate change。

SQL server触发器学习记录

看了几篇博客,对触发器的语法有了大概的了解。但是对except、deleted、intserted关键字很陌生。

EXCEPT:可以理解为B在A中的补集。或者根据单词直译,从A中减掉B。

(SELECT * FROM A{1,1,2,3}) EXCEPT (SELECT * FROM B{1,2,5})结果:3。
顺便也查了一下INTERSECT UNION

INTERSECT:交集

UNION:全集/合集

DELETED:用于存储 DELETE 和 UPDATE 语句所影响的行的复本。在执行 DELETE 或 UPDATE 语句时,行从触发器表中删除,并传输到 deleted 表中。Deleted 表和触发器表通常没有相同的行。

INSERTED:用于存储 INSERT 和 UPDATE 语句所影响的行的副本。在一个插入或更新事务处理中,新建行被同时添加到 inserted 表和触发器表中。Inserted 表中的行是触发器表中新行的副本。

1.插入操作(Insert)

Inserted表有数据,Deleted表无数据

2.删除操作(Delete) 
Inserted表无数据,Deleted表有数据

3.更新操作(Update) 
Inserted表有数据(新数据),Deleted表有数据(旧数据)

经过上述学习,现在基本就能看懂这个update触发器了。接下来就是要增加一个触发条件,必须有LastActivityDate 以外的字段发生变化时,才执行触发器。

第一个想法是把LastActivityDate字段从这段sql里去掉。看起来应该是可以达到效果的,而且改动还很小。

SQL server触发器学习记录

但有一点需要注意,更新触发器需要drop原来的触发器,再create修改后的触发器。

我先去试试去。