您可以通过编程方式完成您的要求。这些是步骤:
- 测试您的“source_test”数据库是否存在,如果存在,请将其删除。
- 连接到您的源数据库,
- 创建源数据库的备份
- 在重命名实际数据库文件时将源数据库恢复到“source_test”数据库
- 执行 SQL Server 实用程序存储过程,
exec sp_msforeachtable 'truncate table ?'
这将创建一个与您的“源”数据库相同的数据库,名为“source_test”。所有触发器、约束、存储过程、SQL Server 帐户以及不是数据表内容或序列号的所有其他数据位都被保留。当它们的表被截断时,所有的序列号将被重置为默认值。
我们使用这 5 个步骤来克隆我们自己的 SQL Server 数据库以用于测试和其他用途。这适用于 SQL Server 2000 向前。
要备份数据库,请按以下形式执行 SQL 语句:
"Backup database " + kstrDbName + " to disk = '" + strFullyPathedBackupFile + "' With Init";
“With Init”是一个关键选项,它告诉 SQL Server 覆盖指定的文件(如果存在)。有关“备份数据库”的 SQL Server 文档,可以找到更多信息。
在 SQL Server 2005 和更高版本上,您可以使用 SMO 恢复数据库,并指定数据库的新名称,以及重命名数据库文件(mdf 和日志文件)。有关如何执行此操作的示例代码,请参阅有关还原功能的 Microsoft SQL Server SMO 文档。
在 SQL Server 2000 上,没有 SMO 支持,因此必须通过执行 SQL 语句手动完成。这采用类似于以下形式的语句:
string strSQL = "Restore database " + strDatabaseName + "from disk = '" + strSourcePathFile + "' with replace, " +
" Move '" + strDatabaseName + "_Data' to '" + strDestinationPathFile + ".MDF', " +
" Move '" + strDatabaseName + "_Log' to '" + strDestinationPathFile + ".LOG' "
然后使用 Alter 语句重命名实际的 MDF 和 LOG 文件以匹配新名称。是的,这意味着在 SQL Server 2000 上,您不能拥有源数据库和目标数据库。对不起。可能可以在还原的同时重命名 MDF 和 LOG 文件,但如果是这样,我的团队无法让它工作。我们已经转移到新的 SQL Server 数据库,但我想我会为了这个答案的完整性提取旧代码。
alter 语句的形式为:
string AlterDbSQL = " Alter database " + strDatabaseName + " MODIFY FILE(NAME = " + Path.GetFileNameWithoutExtension( strDestinationPathFile ) + "_DATA, NEWNAME = " + strDatabaseName + "_Data) " +
" Alter database " + strDatabaseName + " MODIFY FILE(NAME = " + Path.GetFileNameWithoutExtension( strDestinationPathFile ) + "_LOG, NEWNAME = " + strDatabaseName + "_LOG) "
一些注意事项:如果您感兴趣的只是创建一个测试数据库,那么您不需要每次都执行第 2 步(连接到源)和第 3 步(创建备份)。只需创建一个备份,还原它,然后截断表,即可为您要测试的当前数据库创建一个“模板”备份。备份该数据库。现在您已经备份了数据库的数据内容清除版本。这将是一个较小的备份,因此复制速度更快,恢复速度也更快。您需要做的就是添加您的测试数据,然后就可以进行测试了。