2010-09-14 104 views
3

我有一个触发下面的代码:SQL Server 2000和SQL Server 2005中的触发器行为:任何更改?

create trigger trPassDat 

    ON men 
    FOR INSERT, UPDATE 

AS 
    declare @man int; 

    select @man = I.man from men U join inserted I on U.man = I.man 

    if Not exists (select 'True' from deleted where man = @man) 
    BEGIN 
     update men set passdate = getdate() where man = (select man from inserted) 
     return 
    END 

-- UPDATE 

    if  update(pwd) 
    BEGIN 
     update men set passdate = getdate() where man = @man 
    END 
GO 

这是应该更新密码日期:无条件的,如果我们处理的插入,但密码日期应该改变只有当一个更新真的改了密码。

这适用于SQL Server 2000,但不适用于SQL Server 2005.我相当肯定地做了一些愚蠢的事,但为了防万一,有人知道SQL Server 2000和2005之间可能会影响到某些变化这个触发器的行为?即,update()函数?

回答

4

你已经陷入了编码触发器的经典错误,只处理单行更新。

select @man = I.man from men U join inserted I on U.man = I.man 

假设您只会一次更新一行。相反,尝试这样的事情。

update m 
    set passdate = getdate() 
    from inserted i 
     inner join men m 
      on i.man = m.man 
     left join deleted d 
      on i.man = d.man 
    where i.pwd <> isnull(d.pwd, '') 
+0

是的,它现在不能正常工作,它只是没有给出错误! – HLGEM 2010-09-14 17:38:29