无备份还原权限时如何按外键关系生成脚本实现数据库跨服务器迁移
外键关联场景下无备份权限的数据库迁移方案
方案1:调整脚本生成配置,按依赖顺序导出(适用SQL Server SSMS工具)
SQL Server自带的生成脚本功能原生支持按外键依赖排序,无需额外处理:
- 打开SSMS的生成脚本向导,在「选择对象」步骤选择要迁移的整个数据库或指定对象
- 进入「设置脚本编写选项」步骤后,点击「高级」按钮
- 在弹出的高级配置窗口中,找到「常规」分类下的
为依赖对象生成脚本,设置为True - 同分类下找到
脚本排序的依据选项,将默认的「按字母顺序」改为「按依赖关系排序」 - 确认
编写外键脚本选项为开启状态,后续按向导流程正常导出即可,生成的脚本会优先创建无依赖的表,再依次创建有外键关联的表,直接执行不会报错。
方案2:拆分脚本执行逻辑,规避依赖冲突(通用所有数据库)
如果你使用的数据库工具没有按依赖排序的功能,可以通过分阶段执行脚本的方式解决问题:
- 第一次导出脚本时,仅导出不含外键约束的表结构,暂不导出索引、约束、存储过程等其他对象
- 执行上述脚本,在本地数据库完成所有空表的创建
- 第二次导出脚本,仅导出外键约束、索引、触发器的DDL语句,执行后完成所有约束的创建
- 第三次导出数据INSERT脚本,或使用批量数据导入工具完成数据迁移
- 最后导出存储过程、函数、视图等其他数据库对象并执行
注意:如果数据INSERT脚本还是按字母顺序生成,可临时关闭外键校验后再执行:
- SQL Server 环境:执行插入前运行
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all",全部数据插入完成后运行EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"恢复约束校验- MySQL 环境:执行插入前运行
SET FOREIGN_KEY_CHECKS = 0;,全部数据插入完成后运行SET FOREIGN_KEY_CHECKS = 1;恢复约束校验
方案3:使用导入导出向导(适用大数量级场景)
如果数据库数据量较大,生成INSERT脚本执行效率极低,可以用自带的导入导出工具完成迁移:
- 本地提前创建空的目标数据库
- 打开数据库自带的导入导出向导,源端选择测试服务器的源数据库,目标端选择本地刚创建的空数据库
- 选择「复制一个或多个表或视图的数据」,向导会自动识别外键依赖关系,按正确顺序完成表结构创建、约束创建和数据写入
- 该方式仅需要源库的查询权限和目标库的写入权限,不需要备份还原相关的高权限。
内容的提问来源于stack exchange,提问作者joemac12
相关产品推荐
相关产品推荐

