回答:
データベースが使用されていないという事実を知らない限り、GUIで「オフラインにする」ことは使用しないでください。なんでも。これは、いくつかのレッグワークを行わずに知るのは難しいので、このスクリプトをどこかに保存して、常にこれを使用してみませんか?
USE [master];
GO
ALTER DATABASE $dbname$ SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
ALTER DATABASE $dbname$ SET OFFLINE;
そしてもちろんその逆:
ALTER DATABASE $dbname$ SET ONLINE;
GO
ALTER DATABASE $dbname$ SET MULTI_USER;
SINGLE_USER
最初に設定する必要がある理由は、SQL Serverがデータベースに排他的にアクセスする必要があるため、既存のユーザーを削除するためです(オフラインダイアログではなく、デタッチダイアログで実行するオプションがあります)。それはオフラインです。とにかく、大規模なバックアップ操作またはETLジョブの途中でこれを実行する場合や、問題がある可能性がある場合と同様に、データベースを現在使用しているユーザーを確認するために追加のレッグワークを実行したい場合があります。
編集:私はこれについてConnectに提案を提出し(Connect#2687832を参照)、Trelloにも投稿しました(「オブジェクトエクスプローラー」に提出)。
すでにハングアップしている状況にある場合は、サーバー全体で開いている接続を次のようにして検索できることを忘れないでください
sp_who2
マスターなどの別のデータベース。
結果をスキャンして、オフラインにしようとしているデータベースを探します。
これらの行のspid(プロセスID)列の値に注意してください。
一度に1つずつ実行
kill ##
ここで、「##」はspidです。
確かに、これらのプロセスを実行したままにすることが重要ではないことを確認してください。最新のコマンドを終了することもなく、警告もなく、プロセスは終了します。
ALTER DATABASE foo SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
最初に発行することによって、ブロックされない方法でこれを行うことができます...さもなければそれはただ座って待機します、そして忙しいデータベースのために、それは永遠にありえます。