我们的日构建服务器运行单元测试,和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关键字都大写了。