在使用SQL Server时,有时候希望针对数据表中某一字段的修改执行一段触发器代码,比如修改了人员名称时,我们希望数据库会自动执行一代码来修改同一数据表中的姓名拼音首字母字段。如果使用After Update触发器则会让SQL Server崩溃掉,那么有什么办法可以避免这种死循环吗?答案是肯定的,我可以在触发器中判断用户是否修改了姓名字段,如果是则执行后续更新代码,如果用户修改了其他字段,则不执行任何代码。
假设有一张表存储客户的信息,第一个字段是Visitor_ID,第二个字段Visitor_Name,第三个字段是Visitor_PY_Code。我们针对新增和更新动作写两个触发器。
针对新增的触发器很容易写,现在的问题是在更新的触发器,如果再使用Update语句就会循环执行触发器了,系统会崩溃掉的。我们希望只针对单一字段的更新执行触发器。还好SQL提供了COLUMNS_UPDATED()函数,能够判断出哪一字段被更新。于是将更新的触发器写成如下:
CREATETRIGGER[UpdatePYCodeOnly]ON[dbo].[Visitor]
FORUPDATE
AS
IF(COLUMNS_UPDATED()&2)=2BEGIN
declare
@VisitorIDint,
@NameStrnvarchar(50)
Select@VisitorID=Visitor_ID,@NameStr=Visitor_NameFromInserted
UpdateVisitorSetNamePINYIN=dbo.GetPYCode(@NameStr)WhereVisitor_ID=@VisitorID
END
FORUPDATE
AS
IF(COLUMNS_UPDATED()&2)=2BEGIN
declare
@VisitorIDint,
@NameStrnvarchar(50)
Select@VisitorID=Visitor_ID,@NameStr=Visitor_NameFromInserted
UpdateVisitorSetNamePINYIN=dbo.GetPYCode(@NameStr)WhereVisitor_ID=@VisitorID
END
在使用COLUMNS_UPDATED()函数需要注意以下几点:
- 表中第一个字段序号为0,第二个字段序号为1,依此类推
- 表中的字段顺序不要改动
版权声明:本文为博主原创文章,未经博主允许不得转载。
相关推荐
CREATE TRIGGER TT ON TSYS_BAMKZ FOR INSERT AS INSERT TSYS_MKZ SELECT B.MKZM,A.yhz,B.PARENT FROM (SELECT DISTINCT yhz FROM TSYS_MKZ) A,INSERTED B
sql server 触发器 数据库 sql server 触发器 数据库
sqlserver 触发器 insert阿 一个关于触发器的小例子
SQLServer触发器语法.pdf
sqlserver触发器例子 一﹕ 触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约`束。 二﹕ SQL ...
第05节:SQLServer触发器Demo源代码.rar
新增用户发送邮件和手机短信的SqlServer触发器
Sqlserver触发器例子,Sqlserver触发器例子,Sqlserver触发器例子,Sqlserver触发器例子
在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。 常见的触发器有三种:分别应用于Insert , Update , Delete 事件。 我为什么要使用触发器?...
sqlserver2005触发器sqlserver2005触发器sqlserver2005触发器
最近用到触发器,研究了一下,现给菜鸟的你分享下。。
关于SqlServer 触发器这一章的幻灯片
sql server 用语句停用全部触发器, 也可启用全部触发器
利用SQLServer触发器实现表跟踪.pdf
一个SqlServer触发器的Delphi应用源代码..rar
SQLServer触发器实现不同服务器数据同步.pdf
此文档中详细的记载了,sql server触发器中自动生成的临时表,希望可以帮到有需要的朋友们!
SQL server 触发器,在触发Merge过程中,逐行触发的解决办法 用group by 避免是一次触发中的多行更新或删除。
讲述触发器创建,编辑,修改及功能,使用的时候很容易理解
使用SQL Server触发器实现数据表的级联更新.pdf