复制数据库
1.
使用情形
如果某个程序已经比较成熟,现在有个新的客户,需要同样或近似的功能。显然我们不能把二个客户的数据放在同一个数据库里。那么我们需要先备份现有的数据库,再从备份的数据库,将之恢复成另一个名称的数据库。
这与单纯的”恢复数据库“不一样,因为,”恢复数据库“ 完成的是将一个备份恢复至另一个Sql
server上,数据库名称与备份的源数据库名称一样。而复制数据库,恢复后的数据库名称是可以指定的。
2.
相应的存储过程
-
-
-
-
-
- CREATE PROCEDURE Proc_duplicate_DB
- @oldDbName AS NVARCHAR(60)
- ,@newDbName AS NVARCHAR(60)
- ,@bakFile AS NVARCHAR(1000)
- AS
- BEGIN
- SET NOCOUNT ON;
-
-
- IF OBJECT_ID('tempDB..#t') IS NOT NULL
- DROP TABLE #t
-
- SELECT name
- , CASE WHEN CHARINDEX('MDF', physical_name)>1 THEN 'MDF' WHEN CHARINDEX('LDF', physical_name)>1 THEN 'LOG'ELSE NULL END AS FileType
- , physical_name
- INTO #t
- FROM sys.master_files WHERE name = @oldDbName OR name = @oldDbName + '_LOG'
-
- DECLARE @oldMDF AS NVARCHAR(1000)
- DECLARE @oldLDF AS NVARCHAR(1000)
- DECLARE @newMDF AS NVARCHAR(1000)
- DECLARE @newLDF AS NVARCHAR(1000)
-
- SELECT @oldMDF = Physical_Name FROM #t WHERE FileType = 'MDF'
- SELECT @oldLDF = Physical_Name FROM #t WHERE FileType = 'LOG'
-
- SELECT @newMDF = REPLACE(@oldMDF, @oldDbName, @newDbName)
- SELECT @newLDF = REPLACE(@oldLDF, @oldDbName, @newDbName)
-
-
- DECLARE @sql AS NVARCHAR(MAX)
- SET @sql = 'RESTORE DATABASE [' + @newDbName + ']
- FROM DISK = ''' + @bakFile + '''
- WITH NOUNLOAD, REPLACE, STATS = 10,
- MOVE ''' + @oldDbName + ''' TO ''' + @newMDF+ ''',
- MOVE ''' + @oldDbName + '_LOG'' TO ''' + @newLDF+ '''
- ALTER DATABASE '+ @newDbName +' MODIFY FILE(NAME = '+ @oldDbName + ', NEWNAME = '+ @newDbName+ ')
- ALTER DATABASE '+ @newDbName +' MODIFY FILE(NAME = '+ @oldDbName + '_LOG, NEWNAME = ' + @newDbName+ '_LOG)
- '
- PRINT @sql
-
-
- IF OBJECT_ID('temp..#t') IS NOT NULL
- DROP TABLE #t
-
- END
3.
运行上述存储过程(必要时带上该数据库的库名)。示例如下:
- EXEC dbo.Proc_duplicate_DB @oldDbName=N'BestAMD'
- , @newDbName=N'JOMOO'
- , @bakFile=N'D:\40_dbBackup\BestAMD2022-12-06.bak'
上述代码是将数据库名为”BestAMD“ 的备份文件,生成一个名称为
”JOMOO“的数据库,执行上述代码,得到下面的语句

将产生的代码再执行一次,即可

4.
Versions:
2022-12-06
URL:duplicateDB.htm