ユーザーをSQL Server 2008データベースから追​​い出すにはどうすればよいですか?


22

他のユーザーが接続されているため、復元を行う必要があります。すべてのプロセスを切断したと思いましたが、明らかにそうではありませんでした。

Management Studioからこのバックアップを実行できるように、他のすべてのユーザーを開始するにはどうすればよいですか?

回答:


25

それを行うには2つの方法があります。

  1. オブジェクトエクスプローラーでデータベースを右クリックし、[タスク]> [デタッチ]に移動します。「接続をドロップ」チェックボックスを選択します。

  2. ここに説明されているように、データベースをシングルユーザーモードに設定します。

    -- hit Ctrl+Shift+M in SSMS to fill in the template parameter
    USE master;
    GO
    
    ALTER DATABASE N'<Database Name, sysname,>'
    SET SINGLE_USER
    WITH ROLLBACK IMMEDIATE;
    GO
    
    ALTER DATABASE N'<Database Name, sysname,>'
    SET READ_ONLY;
    GO
    
    ALTER DATABASE N'<Database Name, sysname,>'
    SET MULTI_USER;
    GO

たくさんのコメントがあったことに気づかなかった笑 マリアンは正しいです。実際のデタッチを実行する必要はなく、ユーザーを殺すためのスクリプトを取得するだけです。@NickChammasええ、読み取り専用にすると、ユーザーは再接続できなくなります。マルチユーザーに設定すると、復元を実行できます。また、db名はテンプレートからのものであるため、「<データベース名、sysname>」などのタグは、Ctrl + Shift + Mを使用して置き換えることを目的としています。テンプレート化されていないスクリプトでは、dbnameの前後に引用符がありません。
ウィル

43

私は常に以下を使用します:

USE master; -- get out of dbname myself
GO
-- kick all other users out:
ALTER DATABASE [dbname] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
-- prevent sessions from re-establishing connection:
ALTER DATABASE [dbname] SET OFFLINE;

これには時間がかかる場合があります。また、実行しているためにブロックされ、データベースへのアクティブな接続がある場合もあります。。同じデータベースコンテキストを持つ可能性のある他のクエリウィンドウを確認します-これには、開いているダイアログ、オブジェクトエクスプローラー、IntelliSense、長時間実行ジョブなどが含まれます。

そのデータベースの構成に変更を加えたら、私は単純に:

ALTER DATABASE [dbname] SET ONLINE;
ALTER DATABASE [dbname] SET MULTI_USER;

ただし、場合によっては、そのデータベースに対して行う必要があることは、データベースがオンラインである必要があるため、場合によってはシングルユーザーモードのままにしてこれを行う必要があります。

ALTER DATABASE [dbname] SET ONLINE;
GO
USE [dbname];

これで変更を加えることができ、他のユーザーが接続する準備ができたら、単純に:

ALTER DATABASE [dbname] SET MULTI_USER;

2

通常、データベースをsingle_userに設定してからwaitfor delayを実行し、次にデータベースをマルチユーザーに設定し直します。

-- to kill all connections for particular db ... otherwise the restore will fail as exclusive lock cannot be obtained for the db being restored.

    alter database db_name
    set single_user with rollback immediate
    waitfor delay '00:00:05'  -- wait for 5 secs
    alter database db_name
    set multi_user
    restore database db_name from disk = 'D:\restore\db_name.bak'
    with replace, stats = 10, recovery -- if you want to recover your database online
    -- optional if you dont have the same directory/file structure
    move 'datafile logical name' to 'E:\data\physical_name.mdf',
    move 'logfile logical name' to 'F:\log\physical_name_log.ldf'

実際には、restoreステートメントで単一のスクリプト(トランザクション)を実行しているため、「set multi_user」は必要ありません。回復を伴う復元は、データベースをマルチユーザーモードに戻す処理を行います。
スヴェインテルジェゴープ

1

サーバーが複数のリモート接続の試行によって攻撃されたため、上記のオプションはどれもうまくいきませんでした。

私がWindowsファイアウォールの特定のデータベースポートを閉じたとき、通常のAlter .. Set Multi_Userは最初の試行内で機能しました。


-1

以下は実際にすべての接続を強制終了します。シングルユーザーモードの設定に失敗した場合に非常に便利

declare @execSql varchar(1000), @databaseName varchar(100)
-- Set the database name for which to kill the connections
set @databaseName = 'databasename'
set @execSql = '' 
select  @execSql = @execSql + 'kill ' + convert(char(10), spid) + ' '
from    master.dbo.sysprocesses
where   db_name(dbid) = @databaseName
     and
     DBID <> 0
     and
     spid <> @@spid
exec(@execSql)

1
sysprocessesデータベースでロックを保持する可能性があるすべてのセッションを常に考慮するわけではないため、これは機能しません(データベースAのコンテキストでクエリが実行されるが、AのテーブルとBのテーブルを結合する単純なシナリオを考えてください) 。
アーロンバートランド

-1

以下のスクリプトを使用して、すべてのユーザーを無効にするか、特定のDB用に変更できます。

殺すことができるものは何でも!ただし、SQLサービスSPIDは影響を受けません。

Drop table #who

go 

Create table #who(  [spid] int,
                    [ECID] int,
                    [Status] varchar(100),
                    [Loginname] varchar(200),
                    [Hostname] varchar(200),
                    [blk] bit,
                    dbname varchar(200),
                    cmd varchar(1000),
                    requestID int
                  )

go

Insert into #who (Spid, ECID, Status, Loginname, hostname,blk, dbname, cmd, requestid)
exec sp_who

Declare cursKillUsers Cursor for Select 'Kill ' + cast(spid as varchar(100)) + ';' [SQL] from #who where dbname like '%'
Declare @sql varchar(200)
Open cursKillUsers
Fetch next from cursKillUsers into @sql
While @@fetch_status = 0 
begin

    print @sql
    Exec (@sql)
    Fetch next from cursKillUsers into @sql

end

close cursKillUsers
deallocate cursKillUsers

-3

私はこのコードを使用します:

ALTER DATABASE [Dbname] set offline with rollback immediate
GO
ALTER DATABASE [Dbname] set online
GO

しかし、SINGLE USERの例は入力が少ないことがわかります。


3
また、データベースをオンラインに戻すと、復元を開始する前に他のユーザーが再び接続できるようになります。
アーロンバートランド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.