2011-06-23 8 views
4

データベースをバックアップして別のデータベースに復元するSQLスクリプトがあります。私が抱えている問題は、上書きされているデータベースがユーザによって開いてロックされているため、ジョブが失敗するということです。私は手動で添付されたユーザーを殺すことができ、それは正常に実行されますが、私はこのプロセスが毎晩自動的に実行する必要があります。私は毎晩実行する時間を取ることができる殺すコマンドがありますか?または同じことをする復元オプションに何かがありますか?SQL Serverの強制終了コマンド

どのような考えですか?クライアントは、私はデータベースをオフライン(またはDBOのみ)その後、復元を取って検討したい

を再接続する場合

おかげ

答えて

6

KILLは、必ずしも有効ではありません。したがって、さらに再接続することはありません。

ALTER DATABASE TargetDB SET OFFLINE WITH ROLLBACK IMMEDIATE 

または

ALTER DATABASE TargetDB SET RESTRICTED_USER WITH ROLLBACK IMMEDIATE 
+0

+1。殺すのではなく、最高のチョイスに思える。 – niktrs

1

データベースでは、選択したデータベースへの接続を殺すために、次のスクリプトを使用することができますが

USE master 
GO 

ALTER DATABASE YourDatabaseName SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
GO 

ALTER DATABASE YourDatabaseName SET OFFLINE WITH ROLLBACK IMMEDIATE 
GO 

も成功を復元取得するには、次のコードを使用することができます@gbnに同意します。

-- Create the sql to kill the active database connections 
DECLARE @execSql VARCHAR(4000), 
    @databaseName VARCHAR(100) 
    -- Set the database name for which to kill the connections 
SET @databaseName = '[yourdatabase]' 

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 
    ) 
0
DECLARE @pid AS INTEGER 

DECLARE mycursor CURSOR FOR 
select spid 
from sys.sysprocesses 
WHERE dbid = DB_ID('yourdatabasename') 

OPEN mycursor 
FETCH NEXT FROM mycursor INTO @pid 

WHILE @@FETCH_STATUS = 0 
BEGIN 
EXECUTE ('KILL '[email protected]) 
FETCH NEXT FROM mycursor INTO @pid 
END 

CLOSE mycursor 
DEALLOCATE mycursor 
+0

このスクリプトは単に接続されたプロセスをすべて終了し、データベースを復元できるようにします(これはまっすぐに起こります)。 'testdb'エントリを置き換えるだけでいいですか? – Scott

+0

はいこれは、特定のデータベースのすべてのプロセスを強制終了します。 DB_ID関数内のデータベースを、復元するデータベースの名前で変更します。 – niktrs

0
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 

それはあなたのデータベースからすべてのアクティブな接続を殺す、「マスター」データベースを使用して、このクエリを実行します。

関連する問題