SQL Server将新数据迁移到旧架构

时间:2019-01-06 23:29:16

标签: sql-server ms-access

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

现在,我想部署SQL数据库并将其链接到Access。是否可以在保留所有架构的同时删除旧数据并将新数据迁移到SQL Server数据库?

编辑1:

Added

1 个答案:

答案 0 :(得分:2)

如果使用SSMA(Access的Sql迁移助手)进行了迁移,则只需重新运行保存的项目即可。

第一次运行SSMA时,它将在sql服务器上创建数据表,然后传输数据。

但是,您可以再次打开相同的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打开记录集命令(向该openRecordSet命令添加dbOpenDynaset和dbSeeChagees(但这是全局搜索并替换-根本没有多少时间)。

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

Set rst = CurrentDb.OpenRecordset(strSQL)

您需要将以上内容更改为:

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

因此,以上内容将使您的VBA reocrdset代码的99%能够像以前一样正常工作。

唯一的“常见”是,带有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有一个非常令人讨厌的问题,就是您发出更新后(仅在添加期间–仅在添加reo​​crds期间重复!!),然后记录指针跳出当前记录。当您使用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可以为您完成此操作。