2009-01-16 35 views
2

我正在编写代码以将数据从我们的实时Access数据库迁移到具有重组结构的不同模式的新Sql Server数据库。这个Sql Server数据库将与开发中的新版本应用程序一起使用。在实时数据库中迁移数据的查询?

我一直在编写C#中的移植代码,它调用Sql Server和Access并根据需要转换数据。我第一次迁移了一个表,其中有与最近没有更新过的另一个表的新条目相关的条目,并且导致错误,因为无法找到SQL Server中对应表中的记录

因此,我的SqlServer生产表的数据只有1/14/09,而且我正在继续从Access迁移更多的表。所以我想写一个更新方法,它可以找出Access中的新东西,这些东西在Sql Server中没有反映出来。

我目前的想法是写SQL查询的SELECT Max(RunDate)FROM ProductionRuns,给我表中该字段的最新日期。在Access方面,我会写一个SELECT * FROM ProductionRuns WHERE RunDate>?的查询,其中参数是在SQL Server中找到的最大日期,然后在代码中执行我的转换步骤,然后将新数据插入到Sql Server中。

我想知道的是,我是否拥有在该Sql Server表中获取最新日期的语法?有没有更好的方法来做这种实时数据库迁移?

编辑:我所做的是复制当前的实时数据库。然后,我可以在不担心更改的情况下进行迁移,然后在开发过程中使用它进行测试,然后在新数据库和应用程序启用时迁移最新数据。

回答

4

我个人会将这个过程分成两个步骤。

  1. 我会创建访问数据库的SQLServer的精确副本,并从这个临时的SQLServer数据库复制所有数据
  2. 将数据复制到您的目标数据库

在你可以写设置方式SQL代码来完成第二步任务

或者使用SSIS

+0

听起来好像会起作用。然后,当新的数据库启动以捕获所有后来的数据时,我必须再次执行此操作,但无论如何都需要这样做 – 2009-01-16 14:45:02

1

你可能想看看投资于像SQL Data Compare这样的工具。

我相信它也支持访问数据库,您可以下载试用版。

+0

我已经使用ApexSQL Data Diff类似。这不是我将执行迁移项目的方式,但它可以方便地解决和同步数据库之间的差异。 – 2009-01-16 15:55:41

2

一般来说,当你将数据转换到新的d atabase将会把它放在产品中,你在一段时间内关闭数据库的所有用户,运行迁移并打开新的数据库。这确保在进行转换时不会更改数据。当然,我从来不会用c#做这个。数据迁移是一项数据库任务,应该在SSIS中完成(或者如果您拥有旧版本的SQL Server,则为DTS)。

如果您要转换的数据库刚好在开发中,我会创建Access数据库的备份并从那里加载数据以测试数据加载过程并获取数据,以便您可以进行应用程序开发。然后,当需要做实际负载时,您只需关闭真实数据库以供用户使用并从中加载即可。如果你试图保持两者同步,那么你就不会那样做,但是如果你必须这样做,那就使用你的过程在早上备份文件并在早上加载第一件东西。

0

这听起来像你有两个问题,不使用任何人:

  1. 你迁移从一个数据库到另一个数据库
  2. 你正在改变你的模式。

如果您在人们使用数据时尝试迁移数据,那么执行这些操作都会非常棘手。

最简单的方法是基于数据的静态副本来迁移数据,并且还会从捕获静态副本的那一刻起将数据的更新列入队列。我不知道这在Access中有多容易,但在SQLServer或Oracle中,您可以使用重做日志来实现此功能或使用触发器的手动解决方案。穷人的做法是为所有记录已更改记录主键的相关表制作触发器。然后,在旧数据库关闭后,您可以遍历这些密钥并从旧数据库中获取这些记录,并将它们放入新数据库中。只需复制整个记录;如果该记录已被删除,则将其从新数据库中删除。

由于您无法简单复制数据,您必须对其进行转换,因此您的问题更加复杂。这意味着您可能必须关闭两个数据库,并根据更改列表重新迁移记录。这将需要大量的计划来确保你的工作正确,我建议编写一个测试脚本来验证结果数据是否正确。

另外,如果可能的话,我会确保迁移的代码在其中一个数据库中运行。否则,您会复制两次数据,这会严重影响性能。