您的位置: 首页 >日志>前端技术>详细内容

前端技术

WebFuture系统如何从达梦数据库如何迁移到SQLServer

来源:本站原创 发布时间:2022-09-23 15:28:22 浏览次数: 【字体:

数据库从达梦迁移到SQLServer,一般情况下我们可以使用达梦自带的数据库迁移工具,选择 DM ==> SQLServer 按照提示一步一步来完成就可以了

ba3c40e9c06c44a1b0bf4faabf6ca75d.jpg

但如果某些字段的数据类型是 VARCHAR(8188) ,使用达梦数据迁移工具直接迁移到SQLServer就会报错,提示:赋予 列'***'的大小(8188)超出了任意数据类型的最大允许值(8000)。

a612cbac97b14c6d9f0f48ea5e2590b4.jpg

导致报错的原因是某些字段的数据类型在达梦下是 VARCHAR(8188) ,而SQLServer不支持 VARCHAR(8188) 这个格式,VARCHAR(8188) 在 SQLServer 对应的字段类型是 nvarchar(MAX)

因此,我们需要把数据库从达梦迁移到 SQLServer 可以通过导出SQL文件,再用SQL文件导入到 SQLServer。由于达梦数据库生成的SQL文件只适用于达梦数据库本身,我们还需要进行一番修改,下面是达梦迁移到SQLServer的具体步骤:

一、导出SQL数据文件

打开DM数据迁移工具,新建迁移任务

fe840e763a224f6bbe335e0594408c52.jpg

填写迁移任务名称,随便命名,点击确认,下一步

0d2cb5059a054da38ebb21dd776eb0f1.jpg

迁移方式这里,选择 DM ==> SQL

22796569be6a4af498cece87e214777e.jpg

输入数据源的账号 信息

4c29b31e87ba4b9397f7472b36133e23.jpg

“文件”这里要注意,我们需要把建数据表和导入数据的sql分开导出,后面我们只用到数据导入的sql,所以,这里选择“所有数据脚本使用一个单独的文件”,文件的命名按照自己喜好来写就好了,第一个是创建数据表的sql文件名,第二个是导入数据的sql文件名,文件编码这个看时间情况来选就可以了。

807d3eba48b948af9666b6df291bbe03.jpg

选择需要导出的数据库

7f7b3b16a83d42be9881fcefd26a5c42.jpg

选择所以数据表,然后,下一步,下一步,直到导出完成

892ce238b2f24f3da2465ed7ffef0162.jpg


二、修改sql文件,适合SQLServer使用

由于达梦数据迁移工具生成的sql文件,只适用于达梦数据库的导入,直接在SQLServer上使用会报错的,所以我们要修改下sql语句的语法,使其适合SQLServer使用。

我们通过编辑器打开刚才导出的数据文件,注意:打开文档时要注意当前文档显示的编码格式,要改为你前面所生成的sql文件的编码格式,不修改格式会出现乱码的现象

a18bc063233f4e92b2640fd3530f87ff.jpg

通过以以下正则查找并替换,注意:要开启查找的正则条件

/* 替换成 SQLServer 可执行的sql语句的搜索正则 */
(insert into|SET IDENTITY_INSERT)[\s*?]"(\w*?)"\."(\w*?)"

/* 替换为以下内容 */
$1 [dbo].[$3]

6e53d3e30ff54697b125cfd3ad6de05a.jpg

三、创建一个空的数据库

这里的做法有点像当时的SA升级到WT系统,创建一个空白的数据库,然后通过数据库迁移工具把数据库迁移到达梦数据库上,这里刚好反过来,在SQLServer上创建一个空白的数据库,然后把数据重达梦数据库迁移到SQLServer。因为目前没有对应的数据迁移工具,只能通过生成sql文件导入数据的放式。

首先我们创建一个空白的数据库,由于 WF 11.0 以后已经完善了网站的安装流程,无需像 WF 10.0 那样通过命令行代码创建空数据库了。

按照正常的网站搭建流程,搭建一个测试站,把 App_Data目录下的 IndexData 删除或改名(建议改名)

c3985de299b048a2ba113ccb8fd7dce4.jpg

然后执行网站的安装流程,这里的“导入默认数据库”前面的钩去掉

98ca506418ae4d42a1b13d69c57396b3.jpg

执行到配置文件设置这一步就可以了,这里的信息不用填写

046d67b3893c47dcb2c917eabe7d5a9a.jpg

这时我们看下数据库,数据表已经创建成功了,由于我们需要的是一个空的数据库,里面不能有一点数据,通过下面的sql语句查找下哪些数据表里面有数据,如果有数据需要清除掉

SELECT a.name, b.rows FROM sysobjects AS a INNER JOIN sysindexes AS b ON a.id = b.id WHERE (a.type = 'u') AND (b.indid IN (0, 1)) and rows > 0

6fe6489585a64e4aa65dfe1cc6cae4df.jpg

虽然是不导入默认数据,但还是有几个数据表带数据,通过以下代码把这几个数据表的数据删除(重点注意当前操作的数据库是否正确,如果操作失误可能造成不可挽回的损失!)

DELETE FROM 表名称

根据刚才查询得出的数据表名称进行清除

08d4e280404045f29797aaa7550b69e4.jpg

四、导入数据

由于某些表添加外键约束,所以在数据导入时会有约束,如果数据导入的顺序错了就会报错。但数据导入文件里的数据是工具生成的,数据导入顺序都是按照数据库名称进行排序的,无法根据相关外键约束的条件进行导入,如果手工调整工作量太大,不现实,也不科学~

所以,我们需要先把各个数据表的外键约束临时禁用下,通过下面sql查询语列出当前数据所有的表名称,同时生成相关的外键约束禁用语句

SELECT 'alter table ' + a.name + ' NOCHECK constraint all' FROM sysobjects AS a INNER JOIN sysindexes AS b ON a.id = b.id WHERE (a.type = 'u') AND (b.indid IN (0, 1))

49b5c3af53df411f8de8093845c6b8aa.jpg

把所有数据表禁用外键约束的查询语句拷贝出来,再执行

4576d4a9fea446f5bc3e7bb63f0ea345.jpg

通过“文件 - 打开 - 文件”打开上面修改好的sql文件,点击“执行”把数据导入

数据导入完成后,还有最后一步,把刚才禁用的外键约束重新启用,通过以下sql语句生成启用外键约束的查询语句,步骤跟上面禁用外键约束一样

SELECT 'alter table ' + a.name + ' CHECK constraint all' FROM sysobjects AS a INNER JOIN sysindexes AS b ON a.id = b.id WHERE (a.type = 'u') AND (b.indid IN (0, 1))


×

用户登录