2010-05-19 74 views
3

我有以下架构:触发更新另一个数据库中的数据

数据库:测试。 表:per_login_user,字段:用户名(PK),密码

数据库:wavinet。 表:login_user,字段:用户名(PK),密码

我想要做的是创建一个触发器。每当数据库test上表per_login_user一个password场得到更新,相同的值将被复制到现场passwordlogin_user数据库wavinet

我有搜索槽谷歌和发现这个解决方案:http://forums.devshed.com/ms-sql-development-95/use-trigger-to-update-data-in-another-db-149985.html

但是,当我运行此查询:

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 

查询返回的错误信息:

Msg 107, Level 16, State 3, Procedure trgPasswordUpdater, Line 4 
The column prefix 'wavinet.dbo.login_wavinet' does not match with a table name or alias name used in the query. 

回答

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的密码以及...

至于存储密码的简单事实在数据库中清楚:非常糟糕的想法。

+0

感谢您的回答。老实说,我并不是很了解T-SQL。我只是从该链接获取sql查询并尝试修改它。感谢您的解释。当然密码在编程语言方面是加密的。 – Permana 2010-05-19 04:30:30

相关问题