我正在编写一个事件日历,日历的数据我将需要从另一个数据库中提取并在提交之前进行一些更改。
您建议采用哪些基本方法?
此数据不是超级敏感或需要企业解决方案。
我正在考虑编写一个在我的服务器上运行的服务,该服务将每小时检查一次外部数据库的更改,如果有的话 - 将它们加载到我的数据库表中。有更简单的方法吗?
由于
答案 0 :(得分:3)
有很多选择。 2个非常简单的解决方案是:
答案 1 :(得分:1)
您可以编写一个存储过程来检查外部数据库中的新数据,进行必要的更改然后将其结束。
然后,您可以设置执行该存储过程的SQL Server代理作业,并将其设置为每小时运行一次。
答案 2 :(得分:1)
我同意cody,他的答案中有1和2都有用。虽然为你的目的可能有点复杂
使用存储过程 - 建议的方法 - 可能必须首先链接服务器。
似乎您可以使用,可以在代码中运行SP,手动运行,也可以在sql server agent中设置预定作业
http://msdn.microsoft.com/en-us/library/aa213778(SQL.80).aspx
答案 3 :(得分:1)
将链接服务器添加到其他服务器,您可以从中查询:
select * from [LinkedServer].dbname.dbo.Table
这样,您将始终使用当前信息,并且无需编写确定“新内容”或“哪些行已更改”的脚本或存储过程。
答案 4 :(得分:1)
您的选项在某种程度上取决于您运行的SQL Server的风格。但是,整合的确切要求更重要。单向集成的最简单且效率最低的方法是在从源中加载新日历事件之前从目标中删除每个日历事件。如果没有很多要同步的事件,这可能就足够了,比如你根本不需要加载过去的事件。但是如果你需要跟踪同步状态,事情会变得更复杂,工具开始变得重要。这种集成有两个阶段:
提取更改
每个版本的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 Agent安排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以来它有多受限制。但是,导入/导出向导确实有效。