现在的位置: 首页 > 综合 > 正文

避免SQL Server 触发器死循环

2013年05月22日 ⁄ 综合 ⁄ 共 833字 ⁄ 字号 评论关闭

        在使用SQL Server时,有时候希望针对数据表中某一字段的修改执行一段触发器代码,比如修改了人员名称时,我们希望数据库会自动执行一代码来修改同一数据表中的姓名拼音首字母字段。如果使用After Update触发器则会让SQL Server崩溃掉,那么有什么办法可以避免这种死循环吗?答案是肯定的,我可以在触发器中判断用户是否修改了姓名字段,如果是则执行后续更新代码,如果用户修改了其他字段,则不执行任何代码。 

        假设有一张表存储客户的信息,第一个字段是Visitor_ID,第二个字段Visitor_Name,第三个字段是Visitor_PY_Code。我们针对新增和更新动作写两个触发器。

        针对新增的触发器很容易写,现在的问题是在更新的触发器,如果再使用Update语句就会循环执行触发器了,系统会崩溃掉的。我们希望只针对单一字段的更新执行触发器。还好SQL提供了COLUMNS_UPDATED()函数,能够判断出哪一字段被更新。于是将更新的触发器写成如下:

CREATE TRIGGER [UpdatePYCodeOnly] ON [dbo].[Visitor] 
FOR UPDATE
AS
IF (COLUMNS_UPDATED() & 2= 2 BEGIN
declare
  
@VisitorID int,
  
@NameStr nvarchar(50)
  
Select @VisitorID = Visitor_ID, @NameStr = Visitor_Name From Inserted
  
Update Visitor Set NamePINYIN = dbo.GetPYCode(@NameStrWhere Visitor_ID = @VisitorID
END

        在使用COLUMNS_UPDATED()函数需要注意以下几点

  1. 表中第一个字段序号为0,第二个字段序号为1,依此类推
  2. 表中的字段顺序不要改动

 

抱歉!评论已关闭.