在SQL Server 2000和SQL Server 2005中触发器行为有何变化?

3

我有以下代码用于触发器:

    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()函数是否有变化?

1个回答

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, '')

是的,它现在无法正常工作,它只是没有报错! - HLGEM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接