SQL 触发器 - 始终更新或有条件更新



在我的场景中,当表 A 中的此密码更改时,需要更新表 B 中的单个密码。我得到了一个执行此操作的触发器,但触发器始终更新值,即使表 A 中的密码未修改,但修改了其他字段之一。这对我来说似乎是矫枉过正,因为触发器可以修改为仅在专门修改密码字段时更新。

提供的解决方案是否体面,或者更改触发器并添加实际修改行的条件会更好(主要是性能方面)。我可以想象有条件更新的成本比每次都盲目更改值要大。

当前代码:

CREATE TRIGGER [UserSync]
ON [dbo].[Import]
FOR UPDATE
AS
BEGIN
  DECLARE @UserName NVARCHAR(128)
  DECLARE @Password NVARCHAR(128)
  SELECT @UserName=Username
  ,      @Password=Password
  FROM   INSERTED
  UPDATE UserLogin
  SET Password = @Password
  WHERE Name = @UserName
END

更好的是写这个,a) 允许按照 @marc_s 更新多行,b) 只在它发生变化的地方更新,是:

CREATE TRIGGER [UserSync]
ON [dbo].[Import]
FOR UPDATE
AS
BEGIN
  UPDATE UserLogin
  SET Password = i.password
  from UserLogon u
  inner join inserted i on i.Name = u.Name
  inner join deleted d on d.Name = i.Name
  WHERE i.password <> u.password
END

因此,对于事务中的每个用户,旧的(已删除的)和新的(插入的)与基础表(UserLogon)匹配。如果新密码与旧密码不同,则会更新基础表。

最新更新