【问题标题】:Cross DB SQL Trigger Epic Failure跨数据库 SQL 触发史诗般的失败
【发布时间】:2010-01-15 15:28:42
【问题描述】:

我在 SQL 2005 框上有以下 SQL 触发器,应该帮助我将某些人员信息复制到另一个数据库,以用于报告和各种其他事情作为参考。

我有 1 个名为 Connect 的数据库,当前应用程序在其中操作 tblPerson 上的人员数据。我有另一个数据库,在同一个物理盒子上,名为 MATRIX,一个新的应用程序在其中操作它的数据。我正在尝试在 MATRIX 中构建一个名为 tblIdentificationMap 的表,它只存储我们从内部不同应用程序获得的所有各种 ID。

当我启用此触发器并尝试更新 tblPerson 时,我收到以下错误 --> Msg 208, Level 16, State 1, Procedure tblPersonIDMap_OnUpdate, Line 15 Invalid object name 'MATRIX.dbo.tblIndentificationMap'.

这是我的 UPDATE 语句 -->

`  use Connect
  update tblPerson
  set MiddleName = 'Fakey'
  where PersonID = 258243`

这是我的触发器 -->

ALTER TRIGGER [dbo].[tblPersonIDMap_OnUpdate] 


ON  [dbo].[tblPerson] 
   AFTER UPDATE
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;





UPDATE MATRIX.dbo.tblIndentificationMap
        SET     m.PersonID = i.PersonID
                ,m.FirstName = i.FirstName
                ,m.MiddleName = i.MiddleName
                ,m.LastName = i.LastName

    FROM MATRIX.dbo.tblIdentificationMap m, inserted i, deleted d
    WHERE d.PersonID = m.PersonID
END

【问题讨论】:

  • 您的更新语句看起来错误 - 您在“from”中引用表 m、i 和 d,但仅在“where”中指定 m 和 d 表之间的连接,但您使用 i设置新值 - 我不知道这是否会导致您看到的错误,但它确实看起来像一个问题。
  • 谢谢雷,但让我看看能否澄清一下。 d 有旧信息。 i 有新信息。 m 是我正在写入的不同数据库中的表。我使用d = m 来确保我正在更新正确的记录,但我希望将来自i 的数据写入m,因为这是更新的信息。

标签: sql sql-server-2005 triggers


【解决方案1】:

替换

UPDATE MATRIX.dbo.tblIndentificationMap

与

m

在第一行。同样在 SET 区域中,您不需要对 m 的引用(尽管我认为它们不会造成任何伤害,但这会使它变得更难维护)。

您的 SET 语句被混淆了,因为您对别名和真实姓名的引用不一致。

【讨论】:

    猜你喜欢
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 2019-02-14
    • 2017-08-28
    • 1970-01-01
    相关资源
    最近更新 更多