如何在SSMS中用DB_TEST完整覆盖DB_DEVELOP并保留原有名称与权限
同一服务器DB_TEST全量迁移至DB_DEVELOP的解决方案
一、先解决DB_DEVELOP无法删除(3702错误)的问题
如果确认无应用连接但删库报错,直接用SQL命令强制断开连接并删除:
USE master; GO -- 强制断开DB_DEVELOP的所有连接并回滚未提交事务 ALTER DATABASE DB_DEVELOP SET SINGLE_USER WITH ROLLBACK IMMEDIATE; GO -- 删除数据库 DROP DATABASE DB_DEVELOP; GO
二、全量复制DB_TEST到DB_DEVELOP的可靠方案
方案1:备份-恢复(大数据量首选)
这是最稳定的迁移方式,能完整保留所有结构、数据和配置:
- 备份DB_TEST:
在SSMS里右键DB_TEST→ 任务 → 备份,选择「完整」备份类型,指定备份文件路径(比如D:\SQLBackups\DB_TEST_FULL.bak),完成备份。 - 恢复为DB_DEVELOP:
- 右键「数据库」→ 还原数据库
- 源设备:选择刚才生成的备份文件
- 目标数据库:输入
DB_DEVELOP - 切换到「选项」页签,勾选「覆盖现有数据库(WITH REPLACE)」,同时确认数据文件和日志文件的路径与DB_TEST不重复(比如把文件名改成
DB_DEVELOP.mdf和DB_DEVELOP.ldf) - 执行还原即可。
方案2:生成完整架构+数据脚本(小数据量适用)
之前脚本没导全数据是因为选项配置不到位,按以下步骤操作:
- 右键
DB_TEST→ 任务 → 生成脚本 - 选择「整个数据库及所有对象」
- 进入「设置脚本选项」:
- 找到「类型的数据脚本」,选择「架构和数据」
- 把「编写USE DATABASE脚本」设为False
- 「编写CREATE DATABASE脚本」:如果已经删除旧的DB_DEVELOP,设为True并修改数据库名称为
DB_DEVELOP;如果没删,设为False - 把「脚本统计信息」「脚本权限」「脚本触发器」「脚本存储过程」等所有相关选项设为True
- 生成脚本后,打开脚本将开头的
USE [DB_TEST]替换为USE [DB_DEVELOP](未删旧库时),然后执行脚本。
方案3:复制数据库向导(操作简单)
之前提示目标名称已存在,是因为没勾选删除旧库选项:
- 右键
DB_TEST→ 任务 → 复制数据库 - 源、目标服务器都选当前服务器
- 选择「使用SQL Server管理对象(SMO)」方法
- 目标数据库名称填
DB_DEVELOP,勾选「如果目标数据库存在,则删除它」 - 后续步骤保持默认,完成复制即可。
三、恢复原DB_DEVELOP的权限
迁移完成后,需要重新配置原DB_DEVELOP的权限:
- 如果之前有旧库的备份,可以从中导出权限脚本;如果没有,手动添加登录名、用户和角色权限。
- 可执行以下脚本导出旧DB_DEVELOP的用户权限(旧库未删除时可用):
USE DB_DEVELOP; GO SELECT 'CREATE USER [' + dp.name + '] FOR LOGIN [' + sp.name + '];' AS 创建用户脚本, 'EXEC sp_addrolemember ''' + dr.name + ''', ''' + dp.name + ''';' AS 添加角色脚本 FROM sys.database_principals dp JOIN sys.server_principals sp ON dp.sid = sp.sid LEFT JOIN sys.database_role_members drm ON dp.principal_id = drm.member_principal_id LEFT JOIN sys.database_principals dr ON drm.role_principal_id = dr.principal_id WHERE dp.type = 'S' AND dp.name NOT IN ('dbo', 'guest', 'INFORMATION_SCHEMA', 'sys'); GO
内容的提问来源于stack exchange,提问作者jakub podhaisky
相关产品推荐
相关产品推荐

