我有以下架构:
数据库:测试。 表:per_login_user,字段:用户名(PK),密码
数据库:wavinet。 表:login_user,字段:用户名(PK),密码
我想要做的是创建一个触发器。每当数据库password
中的表per_login_user
上的test
字段更新时,相同的值将被复制到数据库{{1}中的表password
中的字段login_user
}}
我通过Google搜索并找到了这个解决方案:http://forums.devshed.com/ms-sql-development-95/use-trigger-to-update-data-in-another-db-149985.html
但是,当我运行此查询时:
wavinet
查询返回错误消息:
CREATE TRIGGER trgPasswordUpdater ON dbo.per_login_user
FOR UPDATE
AS
UPDATE wavinet.dbo.login_user
SET password = I.password
FROM inserted I
INNER JOIN
deleted D
ON I.username = D.username
WHERE wavinet.dbo.login_wavinet.password = D.password
答案 0 :(得分:3)
您更新了login_user,但您的FROM子句不包含login_user。这正是错误信息实际上说的内容。如果要更新表,任何表和UPDATE语句都使用FROM子句,则要更新的表必须存在于FROM子句中:
UPDATE wavinet.dbo.login_user
SET password = I.password
FROM wavinet.dbo.login_user
JOIN inserted I ON wavinet.dbo.login_wavinet.username = I.username
我不确定你想用DELETED伪表上的JOIN实现什么,也不确定你的奇怪WHERE子句。您似乎忽略了用户A和用户B都具有相同密码的简单情况,并且当用户A更改其密码时,您的代码也将更改用户B的密码...
关于在数据库中清除密码的简单事实:非常糟糕的主意。