2009-06-14 85 views
1

我正在编写一个事件日历,并且我需要从另一个数据库中提取日历的数据,并在提交之前进行一些更改。在两个SQL数据库之间集成数据的最佳方法?

你会提出什么样的基本方法?

此数据不是超级敏感或需要企业解决方案。

我正在考虑编写一个在我的服务器上运行的服务,它会每隔一小时检查一次外部数据库的变化,如果有的话 - 将它们加载到我的数据库表中。有一个更简单的方法吗?

谢谢

回答

3

有一堆选项。 2级很容易的解决方案来实现的:

  1. 你可以使用SSIS(SQL Server集成服务)将数据传送到和传送数据源
  2. 您还可以使用SQL Server复制,并成立了发布/订阅方案。
1

您可以编写一个存储过程来检查外部数据库中的新数据,然后进行必要的更改,然后将其结束。

然后,您可以设置一个SQL Server代理作业,执行该存储过程并将其设置为每小时运行一次。

1

我同意科迪,他的答案都有1和2有用。尽管可能对您的目的有点复杂

使用存储过程 - 推荐的方法 - 可能必须先连接服务器。

看来,这也许可以供你使用,无论是运行代码,手动SP或设置在SQL Server代理计划的作业

http://msdn.microsoft.com/en-us/library/aa213778(SQL.80).aspx

1

链接服务器添加到其他服务器,你可以从中查询,如:

select * from [LinkedServer].dbname.dbo.Table 

这样,你总是使用最新信息,而且也没有必要写一个脚本或存储过程决定“什么是新的”或“其行已改变”。

1

您的选择取决于您运行的SQL Server的风格。但您的整合的确切要求更重要。单向集成最简单和效率最低的方法是在从源中加载新日历事件之​​前从目标中删除每个日历事件。如果没有很多要同步的事件,这可能就足够了,就像你根本不需要加载过去的事件一样。但是,如果您需要跟踪同步状态,情况会变得更加复杂,并且工具开始变得重要。有在这种融合的两个阶段:

  1. 提取源更改的数据和
  2. 转换和加载数据到目标

提取改变

的每个版本SQL2008有一个新的change tracking功能,特别针对同步场景。更改跟踪与仅受SQL 2008 Enterprise Edition支持的更改数据捕获不同。如果源数据库正在运行SQL 2008,那么我肯定会首先查看更改跟踪。主要好处是您不需要设置元数据来处理更改数据检测,例如存储上次加载的时间戳并将其与事件修改时间戳进行比较等。您不需要对用户进行任何DDL更改表来跟踪变化,除了在打开更改跟踪:

ALTER DATABASE AdventureWorks2000 SET CHANGE_TRACKING = ON 
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON); 
GO 
USE AdventureWorks2000; 
GO 
ALTER TABLE Person.Person ENABLE CHANGE_TRACKING 
    WITH (TRACK_COLUMNS_UPDATED = ON); 
GO 

如果您不能使用更改跟踪,我会建议使用时间戳或版本号,而不是填充一个单独的变化表触发器。触发器可能在这里将其切断,但我仍然建议避免它们。:)您可能已经在数据库模式中具有必要的时间戳了。

设置复制是进行更改数据捕获的有趣方法。实际上,它在技术上是SQL2008企业版中CDC的前身。我自己并没有使用CDC的复制,但是例如在this book中,作者使用它有很好的经验。

转换和加载

使用SQL代理调度SSIS包。如果您每次都可以完成全部加载而不是加载更改,那么这就是您所需要的。

另一种选择是安排存储过程,但处理记录错误等事情不会那么简单。我的经验是,开发SSIS包比使用T-SQL快很多,特别是如果涉及到链接服务器的话。

SQL Server Express的问题

的SQL Server Express(2005/2008)does not have SQL Agent,只能充当replication subscriber。我通常最终编写了用于SQL Express集成作业的Windows服务,但是使用外部调度程序来运行存储过程可能工作得很好。编写和调度存储过程可能比开发服务要快得多。

SQL Server Express 2008确实有SSIS运行时,但我不完全知道它自not all features are supported以来是多么有限。但是,导入/导出向导确实有效。

相关问题