添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接



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

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

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



CREATE         TRIGGER 
   UpdatePYCodeOnly 
   Visitor 
   UPDATE 
    IF     (COLUMNS_UPDATED()  
   BEGIN 
    declare    
      @VisitorID      
      @NameStr      
   nvarchar 
      Select      
   @VisitorID 
    Visitor_ID,  
   @NameStr 
    Visitor_Name  
    Inserted
      Update     Visitor  
    NamePINYIN  
    dbo.GetPYCode( 
   @NameStr 
   Where 
    Visitor_ID  
   @VisitorID 
    END

避免SQL Server 触发器死循环_触发器


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


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



2008-04-10 15:07发表 [回复] [引用] [举报]

if update(fieldname) ......


就可以了,这样就不怕字段顺序改变