触发器以更新另一个 SQL Server 上的数据

3

我正在使用两个SQL Server,一个是SQL Server 2000,另一个是SQL Server 2005。

当SQL Server 2000中的table1被更新/插入/删除时,我需要在SQL Server 2005中更新另一个表。能否通过触发器实现?如果不行,有哪些可能的选项?

谢谢,祝您愉快!

3个回答

5
如果您想复制数据,而不仅是设置某些不同的内容,那么您应该查看SQL复制,因为它可以更好地管理事务。例如,它将异步更新操作。

如果您必须同步执行它们,或者您只是决定将整个操作作为单个事务包装起来,我会将逻辑放在一个存储过程中以保持清洁。您可以从2000创建一个链接服务器到2005,并在那里引用表作为SERVER.DATABASE.SCHEMA.TABLE。或者,您可以在远程服务器上执行存储过程来进行插入/更新/删除操作。

如果您不想使用SQL复制,您可以考虑通过触发器将从2000中的插入/更新/删除操作写入同一数据库中的单独表中。然后,有一个单独的作业将这些更改写入2005,然后从表中删除它们。这意味着您可以批量处理更改,原始表格的更新速度更快,可以更好地处理两个服务器之间的连接丢失。但是,您将无法保证更新实际应用于2005服务器,并且必须运行一个sql作业的额外复杂性。因此,这是一种权衡。一旦您开始编写和维护这种逻辑,您就会意识到这就是为什么微软编写了复制工具,以便您不必这样做。


4
可以使用链接服务器和触发器,但我只有不好的经验。
为什么不使用触发器?
双向触发器同步很棘手,因为触发器会互相触发。您需要以某种方式控制这个问题,例如使用特殊值。否则,您将收到奇怪的锁定错误。
您需要在链接服务器之间设置MSDTC(分布式事务协调器)。
DBMS对链接服务器帮助不大。SQL很难调试。当类型不匹配时,糟糕的查询通常只是挂起并超时。
在触发器内部或启动触发器的查询中有多个写入事务容易引起死锁。我只会将触发器用于非常简单的更新(一个INSERT / UPDATE / DELETE语句),即使如此,请确保不会发生死锁。我记得我曾经完全重写过一个集成,因为旧应用程序导致触发器死锁。
替代方案
至少有两个问题需要回答:
同步是否为单向或双向?
两个表的模式是否匹配?
如果模式匹配,则复制应该是理想的单向和双向同步。
如果模式不同,就像应用程序集成(EAI)通常情况下一样,您可以考虑:
集成服务(SSIS)甚至是导入/导出工具 - 生成的dtsx包
如果可用(例如BizTalk),则使用其他EAI工具。
编写自定义集成工具
我没有太多使用EAI工具的经验,但将SSIS与自定义.NET解决方案进行比较后,我只能说如果您可以使用SSIS完成工作,那么您将节省大量时间。
仅当SSIS不起作用或不可用(SQL Express)时,我会尝试编程Windows服务,WCF服务等。

对于BizTalk来说,我给出+1的评价——当一个系统需要与其他系统通信时,大多数人似乎都忽视了它。 - Matthew Lock

3

是的,您可以使用联接服务器和数据库上正在更新的触发器来实现此操作。

因此,在触发器内部,您需要执行以下操作。

UPDATE linkedserver.Database1.dbo.myTable
SET ...
WHERE ---

将“set”和“WHERE”中的值替换为您自己的值。

现在,唯一需要注意的是2000年和2005年之间链接服务器的设置,您需要首先尝试一下。


应该使用LINKEDSERVER.Database1.dbo.myTable来引用链接服务器。 - Rory

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接