在我们的开发工作中,经常会面临这样的问题:为了测试需要建立n(n当然不是1,也不是2,而是100,甚至更大)多个与实际环境所使用的数据库相同的数据库。要是靠手工一个接一个的来建立我们所需要的库,当然是可以的。不过这种重复的体力劳动往往让人难以忍受。为了避免纯手工的建库操作,可以考虑使用SQL脚本来完成我们的工作。
使用SQL脚本完成的主要的工作包括:批量建n个库,使用备份文件批量还原n个库,测试完成后,批量删除测试库。
1、批量建库
批量建库的SQL脚本如下:
DECLARE @sql NVARCHAR(200) DECLARE @dbname NVARCHAR(200) DECLARE @count NVARCHAR(10) DECLARE @n int SET @n=1 WHILE @n<101 BEGIN SET @count=LTRIM(STR(@n)) SET @dbname='TESTDB_'+ @count SET @sql='CREATE DATABASE '+@dbname EXEC(@sql) SET @n=@n+1 END
上面的批量建库脚本,使用循环建立了100个库,修改循环条件(@n<101)即可建立自己想要的个数的库。使用此脚本进行批量建库时,所建的库的名称都含有前缀'TESTDB_',只是后面的编号不同。且建立的库都被保存到SQL Server安装时默认的数据库文件保存文件夹下。要想建立的数据库保存到指定的文件夹下,可以采用下面的建库脚本。
DECLARE @sql NVARCHAR(200) DECLARE @dbname NVARCHAR(200) DECLARE @mdfname NVARCHAR(200) DECLARE @ldfname NVARCHAR(200) DECLARE @filename NVARCHAR(200) DECLARE @logname NVARCHAR(200) DECLARE @count NVARCHAR(10) DECLARE @n int SET @n=1 WHILE @n<101 BEGIN SET @count=LTRIM(STR(@n)) SET @dbname='TESTDB_'+ @count SET @mdfname='TESTDB_0' SET @ldfname='TESTDB_0_log' SET @filename='E:\DBTest\DATA\'+@dbname+'.mdf' SET @logname='E:\DBTest\DATA\'+@dbname+'.ldf' SET @sql='CREATE DATABASE '+@dbname+' ON(NAME='''+@mdfname+''',FILENAME='''+@filename+''') LOG ON(NAME='''+@ldfname+''',FILENAME='''+@logname+''')' EXEC(@sql) SET @n=@n+1 END
执行上面的脚本,就将含有逻辑名'TESTDB_0'的数据库文件TESTDB_n.mdf 和含有逻辑名'TESTDB_0_log'的日志文件TESTDB_n_log.ldf将会被存储在'E:\DBTest\DATA\'路径下。关于逻辑文件名,将会在其他文章中进行介绍,敬请期待。
2、批量还原库
库建好后,就需要使用准备好的备份文件来批量还原库。具体脚本如下:
DECLARE @sql NVARCHAR(500) DECLARE @dbname NVARCHAR(100) DECLARE @dbname1 NVARCHAR(100) DECLARE @dbname2 NVARCHAR(100) DECLARE @sdbname1 NVARCHAR(100) DECLARE @sdbname2 NVARCHAR(100) DECLARE @path NVARCHAR(200) DECLARE @dispath NVARCHAR(200) DECLARE @dpath1 NVARCHAR(200) DECLARE @dpath2 NVARCHAR(200) DECLARE @count NVARCHAR(10) DECLARE @n int SET @n=1 SET @path='E:\DBTest\Backup\TRUEDB.bak' SET @dispath='E:\DBTest\DATA\' SET @sdbname1='TESTDB_0' SET @sdbname2='TESTDB_0_log' WHILE @n<101 BEGIN SET @count=LTRIM(STR(@n)) SET @dbname='TESTDB_'+ @count SET @dbname1='TESTDB_'+ @count+'.mdf' SET @dbname2='TESTDB_'+ @count+'_log.ldf' SET @dpath1=@dispath+@dbname1 SET @dpath2=@dispath+@dbname2 SET @sql='restore database '+@dbname+' from disk='"+@path+"' with move '"+@sdbname1+"' to '"+@dpath1+"',move '"+@sdbname2+"' to '"+@dpath2+"' ,STATS=10,replace' EXEC(@sql) SET @n=@n+1 END
上面的脚本将'E:\DBTest\Backup\TRUEDB.bak'文件依次还原到我们所建的100个库中。
3、批量删除库
测试结束后,我们用下面的脚本批量删除库。
DECLARE @dname NVARCHAR(20) DECLARE @sql NVARCHAR(200) DECLARE @n int SET @n=1 WHILE @n<101 BEGIN SET @dname='TESTDB_'+LTRIM(STR(@n)) SET @sql='DROP DATABASE'+@dname EXEC(@sql) SET @n=@n+1 END
至此,批量建库,还原库,删除库的工作完成了。