我们的日构建服务器运行单元测试,和SQL Server数据库相关的测试会创建一个单元测试数据库,测试完成后再删除。
但由于单元测试代码删除数据库和创建数据库部分的不统一,导致单元测试创建的数据库没有被删除,服务器上数据库越来越多,造成数据库操作越来越慢,最后是经常性的单元测试失败。后来服务器上的数据库已经是3500+个了,导致使用管理工具展开数据库都超时。
同事没办法了找到我让我写个脚本来删除这些数据库,我查找了一下资料,写下了如下的指删除数据库的脚本。分享大家:
USE master
GO
IF (EXISTS(SELECT * FROM sysobjects WHERE name = 'drop_testdb_proc'))
DROP PROC drop_testdb_proc
GO
CREATE PROCEDURE drop_testdb_proc
AS
DECLARE @dbname nvarchar(100)
DECLARE unitdbcursor CURSOR FOR
SELECT name FROM sysdatabases WHERE name LIKE '%Unit%'
OPEN unitdbcursor
WHILE 0 = 0
BEGIN
FETCH NEXT
FROM unitdbcursor
INTO @dbname
IF @@FETCH_STATUS <> 0
BEGIN
BREAK
END
EXEC ('DROP DATABASE [' + @dbname + ']')
END
CLOSE unitdbcursor
DEALLOCATE unitdbcursor
GO
EXEC drop_testdb_proc
GO
注意:第十行就是要指删除的数据库的名字匹配。这里是删除数据库名带Unit字样的数字库(我们定义的单元测试用数据库名字)。
这个脚本暂时只支持SQLServer数据库(我们用的是这个),其它的修改修改应该也可以。临时写的没注释,但其实也很简单,大家只要会SQL一看就明白了。SQL关键字都大写了。