【问题标题】:SQL Server migrate new data into old schemaSQL Server 将新数据迁移到旧架构
【发布时间】:2019-01-06 23:29:15
【问题描述】:

我已将 MS Access 表和查询转换为 SQL Server 表和视图,并将它们链接回 Access。在我进行此迁移时,人们正在使用未链接到 SQL Server 的旧 Access 前端。现在,我在 SQL Server 中拥有的数据是我开始迁移时的旧数据。我在使用旧数据的 SQL Server 中创建了表、索引、查询等。

现在,我想部署 SQL 数据库并将其链接到 Access。有没有办法让我删除旧数据并将新数据迁移到 SQL Server 数据库,同时保留所有架构?

编辑 1:

【问题讨论】:

  • 运行一堆 DELETE 和 INSERT SELECT 操作。您最好在完成此操作时关闭用户交互。
  • 在 50-60 个高度相关的表的典型小型应用程序上运行 DELETE 和插入并保持 PK/FK 对等完好无损是一个相当大的挑战。您必须小心先上传父表。因此,对于与 2-3 级深度相关的表,简单的删除和插入远远不足以进行迁移。我经常花一整天时间在迁移助手上进行更改和设置。迁移助手可以节省很多天,并将典型的迁移项目从 4-5 天的工作时间缩短到半天,但仍然需要大量设置。
  • 仅选择要访问的数据类型以进行翻译可能需要一些时间。 (例如,您是否从访问中选择位字段或 int 列作为您的真假 collums。处理日期范围(超出范围)也是如此。还有将项目设置为不使用说 datetime2 列。我可以键入另外 100 多页,但迁移项目将涉及数天的工作,并且简单地删除 + 插入甚至与访问 sql 迁移项目通常所需的内容不同。
  • 要重新迁移,您只需重命名用于迁移的后端 yuo,然后将生产访问后端复制到相同的位置(相同的文件)。此时,您可以在该数据库上重新运行迁移项目。如前所述,您可能花了一天(或两天)来设置该迁移项目。您可以将访问后端换成新的,您的项目仍将运行。所以这就是您使用完全相同的 SSMA 迁移项目的方式如前所述,您真的不希望每次都创建一个全新的项目,因为这是相当多的工作。
  • 假设您迁移了数据,然后在链接+连接到 SQL 服务器的新前端上工作。当你有这一切都很好。然后为了部署到生产环境,您将使用他们一直在处理的访问后端(在您为 sql server 构建新系统时)。您使用 SAME 迁移项目 (SSMA) 迁移了更新的后端,然后您现在将基于 sql 的工作前端部署到每个工作站。因此,您将使用已链接到 sql server 的表分发新的前端(已编译的 accDE)。

标签: sql-server ms-access


【解决方案1】:

如果您使用 SSMA(Access 的 Sql 迁移助手)进行迁移,那么您可以简单地重新运行保存的项目。

第一次运行 SSMA 时,会在 sql server 上创建数据表,然后传输数据。

但是,您可以再次打开同一个 SSMA 项目并重新运行它,您可以选择删除 SQL Server 上的数据,然后再次发送现有的 Access 数据。

SSMA 的“真正”强大功能之一是它可以让您重新发送数据。因此,您可以切片和切块,并多次尝试迁移。

一旦按照您想要的方式进行迁移,您就可以迁移数据。然后,您可以让您的前端与 sql server 一起工作。在此期间,毫无疑问,用户仍在使用旧系统(非 sql server)。

例如,SSMA 允许您向每个表添加一个 PK(如果它没有)。我经常发现“少数”表,例如用于驱动组合框等。没有(没有)该表的 PK 说驱动组合框。因此,在迁移过程中,您希望让 SSMA 为您创建 PK。您可以在迁移后手动执行此操作,但是您需要写下一些“作弊”笔记,因为正如您所指出的,您稍后将不得不再次进行迁移。

因此,如果您对数据结构进行任何“手动”更改,那么您希望在再次迁移时“保存”这些更改。这样做的美妙之处在于,当您在表设计模式(sql server)中时,您可以右键单击,然后选择“脚本”更改。因此,如果您对每个表进行 10 次或更多更改,则可以将更改保存到 sql 脚本中。所以现在您可以迁移,然后运行这些脚本。

现在,在迁移之后,您可以开始让这个前端与 SQL Server 一起工作。在此期间,毫无疑问,用户仍在使用旧系统(访问后端)。

一旦您的新前端在 sql server 上运行良好,您就可以选择一天进行新的推出。您下班后或在停机期间,重新运行您保存的 SSMA 项目。结果是现在 SQL Server 拥有最新的数据。然后,您现在可以推出和部署链接到 SQL Server 的新前端。

如上所述,虽然 SSMA 可以迁移 Access 查询,但我强烈建议您不要这样做。只需迁移数据,并将前端表链接到 sql server。此时,您的 Access 应用程序的 99% 将像以前一样工作。您“可能”必须更改 VBA 打开记录集命令(将 dbOpenDynaset 和 dbSeeChagees 添加到该 openRecordSet 命令(但这是全局搜索和替换 - 根本不需要太多时间)。

所以你可能有很多这样的代码:

Set rst = CurrentDb.OpenRecordset(strSQL)

你需要将上面的内容改为:

Set rst = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset, dbSeeChanges)

因此,以上内容将允许 99% 的 VBA reocrdset 代码像以前一样工作而无需更改。

唯一的“共同点”是使用 Access 后端,当您弄脏表单或弄脏(也添加)记录时,会立即生成自动编号 ID。这允许代码立即获取自动编号 PK。

所以像这样的旧代码:

Set rstRecords = CurrentDb.OpenRecordset("tblmain")
rstRecords.AddNew
' lots of some "code" here follows

 lngPK = rst!ID

在上面,请注意我的 VBA 代码如何获取 PK 自动编号。

在 sql server 中,在强制保存记录之前,您无法获取该 PK。而且 DAO 有一个非常讨厌的问题是,在您发布更新后(仅在添加期间 - 我在仅添加记录期间重复!!!),然后记录指针会跳出当前记录。当您使用 DAO 记录集更新现有记录时,不会发生这种情况(同样:仅适用于新的记录)。

所以,上面的代码现在变成了:

Set rstRecords = CurrentDb.OpenRecordset("tblmain")
rstRecords.AddNew

' code can go here to add data, or set values to the reocord

rstRecords.Update
rstRecords.Bookmark = rstRecords.LastModified
lngNext = rstRecords!ID
rstRecords.Close

因此,对于立即获取自动编号 PK 的代码,我们必须做两件事: 强制记录写入(更新) 然后在更新之后,重新定位记录指针。 (您只需要在添加时重新发布 - 而不是编辑,但无论如何我经常这样做)。这个重新定位问题可能是我使用 DAO 的最大痛苦(ADO 不需要重新定位)。

因此,您的代码在该 reocrdset 中添加/设置字段等不必更改。因此,请保留该代码之前所做的任何事情。

现在发布更新,然后获取自动编号 PK。

所以上面应该涵盖了您必须更改的 99% 的 VBA 代码。即使在一个相当大的项目中,上述问题也只会在少数地方发生。 (我发现我可以在代码库中搜索“.add”,并且可以在发出“.update”命令之前快速确定代码是否正在抓取自动编号PK。

表单也是如此。当用户开始输入时,表单变得“脏”。使用Access后端,可以通过代码获取自动编号PK,但是使用sql server后端,您必须在表单中发出记录保存,然后获取PK ID。

所以,你添加这一行:

If me.Dirty = True then me.Dirty = false

lngID = me!id

所以你添加了一行来强制保存记录(me.Dirty = false)。

我再次发现,即使有 150 个表单,也只有 1 或 2 个会在表单记录保存之前“抓取”PK id。因此,对于两种表单和 VBA reocordset 代码,都将出现无法为新记录抓取的自动编号的“缺乏”。很少有表格会获取 PK 自动编号 ID,但有些表格确实需要这个(比如添加子记录)。但是,现有表单+子表单没有这个问题,因为当焦点从主表单跳转到任何子表单时,访问总是会发出记录保存。

不管怎样,一旦你让新的前端工作(当然还有一个使用与以前相同的表名链接前端)。

如果我记得,SSMA 倾向于将“dbo”放在 Access 表链接名称的前面——你不希望这样。 sql server 端的 dbo 模式是默认的,同样不会造成任何问题或问题。

是的,SSMA 允许您重新运行迁移,并允许您在重新迁移期间删除 SQL Server 上的数据。您不需要删除旧数据,SSMA 可以为您完成。

【讨论】:

  • 谢谢你。在过去的 3 个小时里我一直在玩这个,我意识到,除了使用以前保存的项目,你还可以简单地启动一个新项目,链接到 SQL 服务器数据库,如果你在覆盖模式上点击全部跳过,然后选择仅迁移数据。这将保留您在 SQL Server 中的所有架构,并且仅迁移数据。
  • 我大约 2-3 个月前开始学习 Access 和 SQL Server,一路上遇到了很多困惑。我还有第二个堆栈溢出帐户。在过去的 3 个月里,您帮了我很大的忙,因为您回答了我的很多问题。您的回答总是详细且易于理解。我已经阅读了您的博客,并且在其他论坛上也阅读了很多您的回复。我一直想感谢你,但 StackOverflow 上没有消息传递功能。谢谢!
  • 我真的会努力重新使用相同的迁移项目。 Evyone 必须多次迁移。因此,您需要花一天(或两天)的时间来设置迁移项目。您必须在该迁移项目中进行至少 20 多个甚至更多的设置(如果没有,那么您的迁移可能没有正确完成)。如果您创建一个新的迁移,那么您的 20 多个设置将丢失,您必须重新执行它们。需要在项目中更改使用日期时间(而不是日期时间2)的设置等简单的事情。也许您的记忆力超级好,并且您不会忘记为迁移所做的所有设置
猜你喜欢
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-14
  • 2013-02-08
  • 2010-12-28
  • 2011-07-02
  • 1970-01-01
相关资源
最近更新 更多