0

統合テスト中に、次を使用してデータベースを削除しようとします。

USE master
ALTER DATABASE TestXyz SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DROP DATABASE TestXyz

ただし、(テストの数を考えると)アプリケーションのバックグラウンドプロセスの1つがとの間を行き来することがよくSET SINGLE_USERあります。DROP DATABASEこれにより、データベースのシングルユーザーになり、が壊れますDROP

RESTRICTED_USERアプリケーションには現在許可があるため、使用できませんdb_owner(大量のレガシーコードが必要であり、その一部はそれを必要とするため、テストのためだけに変更されることはありません)。

OFFLINEディスクからデータベースファイルを削除しないので使用できません。

この問題をどのように解決しますか?

4

3 に答える 3

1

OKプランb...接続のドロップを繰り返し、アプリケーションドメインから離れるようにDBの名前を変更します。次に、それをドロップします。接続の反復処理を処理するには、名前の変更を試してみると、接続を切断できるようになるまで実行できるようになります。以下のサンプルコードは、DBTestDBを作成します。ループが成功した後にドロップする前に、whileループで名前をtestdb2に変更します。

-- Setup a scratch Db for testing
create database testdb
go
use testdb

while exists (select name from sys.databases where name = 'testdb')
Begin
  DECLARE @DbName nvarchar(50) SET @DbName = N'testdb'

    DECLARE @EXECSQL varchar(max) SET @EXECSQL = ''

    SELECT @EXECSQL = @EXECSQL + 'Kill ' + Convert(varchar, SPId) + ';' 
    FROM MASTER..SysProcesses 
    WHERE DBId = DB_ID(@DbName) AND SPId <> @@SPId

    EXEC(@EXECSQL)

    Begin try
        EXEC sp_renamedb 'testdb', 'testdb2'
    end try
    Begin Catch
    print 'failed to rename'
    End Catch
end

drop database testdb2
于 2012-08-28T07:17:58.007 に答える
0

これを一度試してください:

  1. アプリケーションサービスを停止し、クエリを実行します。
  2. アプリケーションサービスを停止して再起動SQL Server Servicesし、クエリを実行します。
于 2012-08-28T06:33:15.147 に答える
0

私は最終的に次のアプローチを使用してそれを解決しました:

ALTER LOGIN MyAppUser DISABLE
ALTER DATABASE TestXyz SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DROP DATABASE TestXyz
ALTER LOGIN MyAppUser ENABLE

テストデータベース管理プロセスに別のログインを使用できるため、これにより、アプリケーションがDBにアクセスするのをブロックできます。(ここでの理由は、SINGLE_USERすでに接続されているユーザーをキックするためです。すでに接続されているかどうかは確認ALTER LOGINしていませんが、そうではないと思います)。

別のオプションは、データベースを削除するMyAppUser前にデータベースから削除することですが、私は今それについて考えただけで、そのためのコードはありません。

于 2012-08-28T23:06:05.903 に答える