【问题标题】:Trigger to update data in another DB触发更新另一个数据库中的数据
【发布时间】:2010-05-19 02:26:57
【问题描述】:

我有以下架构:

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

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

我想做的是创建一个触发器。每当数据库test 中表per_login_user 上的password 字段更新时,相同的值将被复制到数据库login_user 中表login_user 中的字段passwordwavinet

我通过谷歌搜索并找到了这个解决方案: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.

【问题讨论】:

    标签: sql-server triggers


    【解决方案1】:

    您更新了 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 的密码...

    至于在数据库中明文存储密码的简单事实:非常糟糕的主意。

    【讨论】:

    • 感谢您的回答。老实说,我并不是很了解 T-SQL。我只是从该链接获取 sql 查询并尝试修改它。感谢您的解释。当然密码在编程语言方面是加密的。
    猜你喜欢
    • 1970-01-01
    • 2012-02-13
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 2013-02-23
    相关资源
    最近更新 更多