t-sql如何创建连接2台服务器的触发器

Posted

技术标签:

【中文标题】t-sql如何创建连接2台服务器的触发器【英文标题】:t-sql how to create a trigger that joins 2 servers 【发布时间】:2015-07-31 12:46:43 【问题描述】:

我正在尝试在 2 个 SQL Server 实例上完成触发器。我正在运行 MS Dynamics ERP 套件 CRM 和 GP。一旦另一个表发生更新,我需要从一个服务器中删除数据。如果我在同一个实例上有 2 个数据库,我已经编写了一个脚本来完成这个任务。但是,当我尝试通过修改代码来调用其他服务器时,我得到了错误。

我在服务器 SQL12\CRM 实例 CRM_MSCRM DB 上有一个表。并且,另一个位于服务器 SQL12 主实例 Comp1 DB 上。这是我的代码:

USE [CRM_MSCRM]
GO

/****** Object:  Trigger [dbo].[trgDeleteEmpAccList_Weld]    Script Date:     7/31/2015 7:45:53 AM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


CREATE TRIGGER [dbo].[trgDeleteEmpAccList_Weld]

ON [dbo].[Cfs_jobBase]
AFTER INSERT, UPDATE

AS

BEGIN

DELETE p
    FROM [SQL12].[CFSPR].[dbo].[PA01408] p
    INNER JOIN [CRM_MSCRM].[dbo].[Cfs_jobbase] j
    ON p.paprojnumber COLLATE Latin1_General_CI_AS = j.cfs_jobnumber COLLATE Latin1_General_CI_AS
    INNER JOIN FROM [SQL12].[CFSPR].[dbo].[UPR00100] e
    ON p.EMPLOYID = e.employid

    WHERE (j.statuscode = 2 OR j.statuscode = 5) AND (e.DEPRTMNT = 'THERM' OR j.cfs_enddate <=DATEADD(day,-2,getdate()))

    PRINT 'AFTER UPDATE Trigger fired.'
END

GO

我收到 Comp1 表项的无效对象错误。我已将另一台服务器添加为链接服务器以尝试绕过此问题,但仍然出现。

下划线错误的屏幕截图:

! [1]:http://i.imgur.com/fNo5sPs.png

任何帮助将不胜感激!

【问题讨论】:

从 FROM innerjoin 中移除 坏主意。如果可能的话,让触发器在本地排队工作(使用例如表或服务代理等)。否则,您通常会严重影响可用性/可靠性。 删除“FROM”有效!!谢谢乔纳森! 哦,很好,但是在不同的服务器上触发不是一个好主意@TrayS 您是说您看到的唯一“错误”是 Management Studio 用红色波浪线在远程对象下划线吗?那只是 IntelliSense 无法查看远程元数据。忽略它或关闭 IntelliSense。 “错误”是您运行代码时发生的实际异常,而不是视觉现象。 【参考方案1】:

我认为您正在寻找的是 Linked SQL Server。易于设置并允许从一台服务器访问链接服务器。

这是一个关于如何设置的链接。 http://www.codeproject.com/Articles/35943/How-to-Config-Linked-Servers-in-a-Minute

然后您可以使用 [server].[database].[schema].[table]. 查询链接服务器 例如:Select * FROM DatabaseServer1.db1.dbo.table1。

如前所述,请注意性能损失。本地表和链接服务器表之间的连接操作真的很慢。为了加快查询速度,将链接服务器上所需的数据查询到表变量中是一种方法。使链接查询尽可能简单。

【讨论】:

以上是关于t-sql如何创建连接2台服务器的触发器的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL 之 触发器

触发器 实现两台服务器的数据同步

T-SQL触发器

SQL Server T—SQL 存储过程 触发器

触发器创建删除等操作

我如何从另一台服务器的另一个数据库中获取数据? [复制]