触发更新另一个sql server上的数据

时间:2009-02-26 20:25:11

标签: sql-server triggers

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

当SQL Server 2000中的table1更新/插入/删除时,我必须更新SQL Server 2005中的另一个表。是否可以在触发器中实现?如果没有,那么可能的选择是什么?

谢谢你,祝你有愉快的一天!

3 个答案:

答案 0 :(得分:5)

如果您想要复制数据,而不仅仅是设置不同的东西,那么您应该查看SQL Replication,因为它可以更好地管理数据。例如,它将异步进行更新。

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

如果您不想进行SQL复制,则可以考虑通过触发器将2000中的insert / update / deletes写入同一数据库中的单独表中。然后有一个单独的作业将这些更改写入2005,然后将其从表中删除。这意味着您可以批量更改,意味着更快地完成对原始表的更新,更好地处理两台服务器之间丢失的连接。但是,您不太可能保证更新实际应用于2005服务器,并且您必须运行更复杂的sql作业。所以这是一个权衡。一旦你开始编写和维护这种逻辑,你就会意识到这就是MS编写复制内容的原因,所以你没必要这样做。

答案 1 :(得分:4)

可以使用链接服务器和触发器,但我只有不好的经验。

为什么不使用触发器?

与触发器的双向同步很棘手,因为触发器会互相激发。你必须以某种方式控制它,例如使用特殊值。 否则,您将遇到奇怪的锁定错误。

您需要在链接服务器之间设置MSDTC(分布式事务处理协调器)

DBMS对链接服务器无法提供帮助。调试SQL要困难得多。错误的查询通常只是在类型不匹配等时挂起和超时。

触发器中的多次写入或启动触发器的查询中的事务容易导致死锁。我只会将触发器用于非常简单的更新(一个INSERT / UPDATE / DELETE语句),甚至可以确保不会发生死锁。我记得当遗留应用程序通过触发器导致死锁时,我必须完全重写一个集成。

<强>替代

至少有两个问题要回答:

  • 表间是单向还是双向?
  • 这两个表的模式是否匹配?

如果模式匹配,复制应该是单向和双向同步的理想选择。

如果模式不同,通常是应用程序集成(EAI)的情况,您可以考虑:

  • 集成服务(SSIS)甚至导入/导出工具生成的dtsx包
  • 其他一些EAI工具(如果可用)(如BizTalk)
  • 编写自定义集成工具

我对EAI工具没有多少经验,但是将SSIS与自定义.NET解决方案进行比较我只能说如果你可以通过SSIS完成工作,那么你将节省很多的时间。

只有当SSIS不起作用或不可用时(SQL Express)我才会尝试编写Windows服务,WCF服务等。

答案 2 :(得分:3)

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

在你的触发器中你会做这样的事情。

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

包含集合和WHERE的值。

现在,关于服务器在2000年到2005年之间的设置方式,你必须先尝试一下。