我正在使用 SQL Server 2012 构建一个系统,它是一个包含相同数据类型但针对每个用户的 Web 应用程序,因此我们为每个用户使用一个数据库,每个数据库都具有相同的结构,并且它是动态创建的,并且在用户单击时生效在确认帐户电子邮件上。
问题是创建数据库的脚本正在恢复一个名为 DB_GENERIC.bak 的数据库,它花费的时间比我预期的要多。我正在寻找优化这一点的方法,并最终创建了一个全新的数据库,但减少了所需的时间。(现在正在使用大约 15 秒来创建数据库),通用数据库恢复它的小(大约 5mb,和 600kb 压缩)并且所有表都是空的。
除了恢复完整的数据库备份之外,还有其他方法可以完成此操作吗?我可以在 t-sql 上编写整个通用数据库的脚本并执行更改数据库名称吗?它会更快吗?或者它是压缩或生成资源消耗较少的备份的任何其他方式,问题是我不需要数据或任何东西,只需要表、过程、函数和模式。
提前致谢
UDPATE:
感谢所有回答我问题的人,答案都很棒而且很有帮助。我最终使用了@Love2Learn 答案,并尝试了 detach-copy-attach 方法。
只是为了让您想象这是如何实现的,我有一个存储过程,它负责从具有以下内容的数据库模板复制-附加新数据库:
--executing bat that copies the database-1-template.mdf and database-2-template.mdf (as well as log files) to the DATA folder in my sql instance
--and renames them (then they'll be attached)
DECLARE @BATCopy VARCHAR(MAX) = 'C:\helpers\copyMDFAndLogFiles.bat'
--building command for xp_cmdshell with parameters (new databases names)
DECLARE @command varchar(500) = @BATCopy + ' ' + @database1Name + ' ' + @database2Name
--PRINT @command
EXEC xp_cmdshell @command, no_output
--attaching new databases
SET @SQL = ' USE [master]
CREATE DATABASE ' + @database1Name + '
ON (FILENAME = ''' + @SQLDATAPath + @database1Name + '.mdf''),
(FILENAME = ''' + @SQLDATAPath + @database1Name + '_log.ldf'')
FOR ATTACH;
CREATE DATABASE ' + @database2Name+ '
ON (FILENAME = ''' + @SQLDATAPath + @database2Name+ '.mdf''),
(FILENAME = ''' + @SQLDATAPath+ @database2Name+ '_log.ldf'')
FOR ATTACH;'
EXECUTE(@SQL)
--renaming logical files
SET @SQL = '
ALTER DATABASE '+@database1Name +'
MODIFY FILE (NAME = Database1_Generic, NEWNAME = '+@database1Name +')
ALTER DATABASE '+@database1Name +'
MODIFY FILE (NAME = Database1_Generic_Log, NEWNAME = '+@database1Name +'_log)
ALTER DATABASE '+@database2Name+'
MODIFY FILE (NAME = Database2_Generic, NEWNAME = '+@database2Name+')
ALTER DATABASE '+@database2Name+'
MODIFY FILE (NAME = Database2_Generic_Log, NEWNAME = '+@database2Name+'_log)
'
EXECUTE (@SQL)
我希望这可以帮助任何需要做我需要做的事情的人,并感谢大家的回答。
朱利安。