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台服务器的触发器的主要内容,如果未能解决你的问题,请参考以下文章