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

时间:2016-02-09 10:13:20

标签: sql sql-server triggers

在我的方案中,当表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

1 个答案:

答案 0 :(得分:1)

更好的是写这个,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)匹配。如果新密码与旧密码不同,则更新基础表。