290

データベースの名前を変更したいのですが、データベースで「排他ロックを取得できませんでした」というエラーが引き続き発生します。これは、まだアクティブな接続があることを意味します。

名前を変更できるように、データベースへのすべての接続を切断するにはどうすればよいですか?

4

19 に答える 19

382

Adam が提案したアプローチが機能しない理由は、アクティブな接続をループしている間に新しい接続が確立され、それらを見逃す可能性があるためです。代わりに、この欠点がない次のアプローチを使用できます。

-- set your current connection to use master otherwise you might get an error

use master
ALTER DATABASE YourDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

--do you stuff here 

ALTER DATABASE YourDatabase SET MULTI_USER
于 2008-08-14T19:56:56.633 に答える
111

これを実行するスクリプトは、「DB_NAME」をデータベースに置き換えて、次へのすべての接続を強制終了します。

USE master
GO

SET NOCOUNT ON
DECLARE @DBName varchar(50)
DECLARE @spidstr varchar(8000)
DECLARE @ConnKilled smallint
SET @ConnKilled=0
SET @spidstr = ''

Set @DBName = 'DB_NAME'
IF db_id(@DBName) < 4
BEGIN
PRINT 'Connections to system databases cannot be killed'
RETURN
END
SELECT @spidstr=coalesce(@spidstr,',' )+'kill '+convert(varchar, spid)+ '; '
FROM master..sysprocesses WHERE dbid=db_id(@DBName)

IF LEN(@spidstr) > 0
BEGIN
EXEC(@spidstr)
SELECT @ConnKilled = COUNT(1)
FROM master..sysprocesses WHERE dbid=db_id(@DBName)
END
于 2008-08-14T19:57:15.073 に答える
55

それを殺し、火で殺します:

USE master
go

DECLARE @dbname sysname
SET @dbname = 'yourdbname'

DECLARE @spid int
SELECT @spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname)
WHILE @spid IS NOT NULL
BEGIN
EXECUTE ('KILL ' + @spid)
SELECT @spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname) AND spid > @spid
END
于 2010-05-12T10:40:36.627 に答える
27

SQL Management Studio Express の使用:

オブジェクト エクスプローラー ツリーで、[管理] の下にある [アクティビティ モニター] までドリルダウンします (見つからない場合は、データベース サーバーを右クリックして [アクティビティ モニター] を選択します)。アクティビティ モニターを開くと、すべてのプロセス情報を表示できます。関心のあるデータベースのロックを見つけて、それらのロックを強制終了できるはずです。これにより、接続も強制終了されます。

その後、名前を変更できるはずです。

于 2008-08-14T19:58:03.947 に答える
24

私はいつも使ってきました:


ALTER DATABASE DB_NAME SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
GO 
SP_RENAMEDB 'DB_NAME','DB_NAME_NEW'
Go 
ALTER DATABASE DB_NAME_NEW  SET MULTI_USER -- set back to multi user 
GO 
于 2008-08-14T20:00:23.427 に答える
14

オフラインにするのにはしばらく時間がかかり、それで問題が発生することがあります..

私の意見では最も堅実な方法:

Detach DB を右クリック -> Tasks -> Detach... "Drop Connections" にチェック OK

接続 データベースを右クリック -> 接続.. 追加... -> データベースを選択し、[接続先] 列を目的のデータベース名に変更します。Ok

于 2011-01-05T14:49:27.437 に答える
6
Select 'Kill '+ CAST(p.spid AS VARCHAR)KillCommand into #temp
from master.dbo.sysprocesses p (nolock)
join master..sysdatabases d (nolock) on p.dbid = d.dbid
Where d.[name] = 'your db name'

Declare @query nvarchar(max)
--Select * from #temp
Select @query =STUFF((                              
            select '  ' + KillCommand from #temp
            FOR XML PATH('')),1,1,'') 
Execute sp_executesql @query 
Drop table #temp

'master'データベースを使用してこのクエリを実行すると、データベースからすべてのアクティブな接続が強制終了されます。

于 2012-02-01T09:30:22.690 に答える
5

通常、データベースを復元しようとすると、そのエラーが発生します。通常は、Management Studio のツリーの一番上に移動し、データベース サーバーを右クリックして再起動します (開発マシン上にあるため、これは運用環境では理想的ではない可能性があります)。 )。これにより、すべてのデータベース接続が閉じられます。

于 2008-08-15T15:52:24.463 に答える
4

MS SQL Server Management Studio 2008 でこの種のことを確実に実行する方法を次に示します (他のバージョンでも機能する可能性があります)。

  1. オブジェクト エクスプローラー ツリーで、ルート データベース サーバー (緑色の矢印) を右クリックし、[アクティビティ モニター] をクリックします。
  2. アクティビティ モニターで [プロセス] タブを開き、[データベース] ドロップダウン メニューを選択して、必要なデータベースでフィルター処理します。
  3. オブジェクト エクスプローラーで DB を右クリックし、[タスク] -> [オフラインにする] タスクを開始します。あなたがしている間、これをバックグラウンドで実行したままにします...
  4. 可能な限り安全にシャットダウンします。
  5. プロセス タブから残りのすべてのプロセスを強制終了します。
  6. DB をオンラインに戻します。
  7. DB の名前を変更します。
  8. サービスをオンラインに戻し、新しい DB を指すようにします。
于 2010-11-12T04:30:46.740 に答える
4

オブジェクト エクスプローラーの MS SQL Server Management Studio で、データベースを右クリックします。次のコンテキスト メニューで、[タスク] -> [オフラインにする] を選択します。

于 2008-08-14T19:56:56.540 に答える
4

もう 1 つの "kill it with fire" アプローチは、MSSQLSERVER サービスを再起動することです。コマンドラインから何かをするのが好きです。これを正確に CMD に貼り付けます: NET STOP MSSQLSERVER & NET START MSSQLSERVER

または、「services.msc」を開き、「SQL Server (MSSQLSERVER)」を見つけて右クリックし、「再起動」を選択します。

これにより、そのインスタンスで実行されているすべてのデータベースへのすべての接続が「確実に」強制終了されます。

(サーバー/データベースの構成を変更して元に戻す多くのアプローチよりも、これが好きです)

于 2011-08-18T22:16:24.600 に答える
3

このシナリオで私のために機能するオプションは次のとおりです。

  1. 問題のデータベースで「デタッチ」操作を開始します。これにより、DB でのアクションを妨げるアクティブな接続を表示するウィンドウ (SQL 2005 の場合) が開きます。
  2. アクティブな接続を終了し、デタッチ操作をキャンセルします。
  3. これで、データベースを復元できるようになります。
于 2011-12-28T09:18:26.237 に答える
2

データベース名を右クリックし、[プロパティ]をクリックしてプロパティウィンドウを取得し、[オプション]タブを開いて、[アクセスの制限]プロパティをマルチユーザーからシングルユーザーに変更します。[OK]ボタンを押すと、開いているすべての接続を閉じるように求められます。[はい]を選択すると、データベースの名前を変更するように設定されます。

于 2010-11-15T11:13:29.100 に答える
2

これらは私(SQL2008 Enterprise)では機能しませんでした。実行中のプロセスやDBに接続されているユーザーも表示されませんでした。サーバーを再起動すると (Management Studio で Sql Server を右クリックして [再起動] を選択)、DB を復元できました。

于 2012-05-01T03:10:41.877 に答える
2

これを試して:

ALTER DATABASE [DATABASE_NAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE
于 2008-08-14T19:58:13.777 に答える
2

SQL Server 2008 R2 を使用しています。DB は既にシングル ユーザー用に設定されており、データベースでのアクションを制限する接続がありました。したがって、推奨されるSQLMenace のソリューションはエラーで応答しました。これが私の場合に機能したものです。

于 2012-06-12T11:04:08.253 に答える
-1

SP_Who コマンドを使用して、データベースを使用するすべてのプロセスを強制終了し、データベースの名前を変更できます。

于 2014-06-02T09:58:11.040 に答える