在我的方案中,当表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
答案 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)匹配。如果新密码与旧密码不同,则更新基础表。