2010-09-14 103 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