2010-09-14 4 views
3

je le code suivant pour un déclencheur:Comportement de déclencheur dans SQL Server 2000 et SQL Server 2005: tout changement?

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 

qui est censé mettre à jour la date du mot de passe: sans conditions si nous traitons avec un insert, mais la date de mot de passe doit être modifié que si une mise à jour a vraiment changé le mot de passe .

Cela fonctionne dans SQL Server 2000, mais pas dans SQL Server 2005. Je suis sûr d'avoir fait quelque chose de stupide, mais, au cas où, quelqu'un est au courant de certains changements entre SQL Server 2000 et 2005 qui pourraient affecter le comportement de ce déclencheur? A savoir, la fonction update()?

Répondre

4

Vous êtes tombé dans l'erreur classique de codage de votre déclencheur pour gérer uniquement les mises à jour à une ligne.

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

suppose que vous ne mettrez à jour qu'une ligne à la fois. Au lieu de cela, essayez quelque chose comme ça.

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

Oui, cela ne fonctionne pas correctement maintenant, cela ne donne pas d'erreur! – HLGEM