Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server Kill命令_Sql_Sql Server - Fatal编程技术网

SQL Server Kill命令

SQL Server Kill命令,sql,sql-server,Sql,Sql Server,我有一个SQL脚本,它备份一个数据库,然后通过另一个数据库进行恢复。我遇到的问题是,被覆盖的数据库被用户锁定打开,因此作业失败。我可以手动杀死连接的用户,它运行良好,但我需要这个过程每天晚上自动运行。是否有一个杀戮命令,我每天晚上都有时间执行?或者在恢复选项中是否有相同的操作 有什么想法吗 谢谢如果客户端重新连接,KILL并不总是有效的 我会考虑将数据库脱机或DBO,然后恢复。这样将防止进一步的重新连接 ALTER DATABASE TargetDB SET OFFLINE WITH ROLLB

我有一个SQL脚本,它备份一个数据库,然后通过另一个数据库进行恢复。我遇到的问题是,被覆盖的数据库被用户锁定打开,因此作业失败。我可以手动杀死连接的用户,它运行良好,但我需要这个过程每天晚上自动运行。是否有一个杀戮命令,我每天晚上都有时间执行?或者在恢复选项中是否有相同的操作

有什么想法吗


谢谢

如果客户端重新连接,KILL并不总是有效的

我会考虑将数据库脱机或DBO,然后恢复。这样将防止进一步的重新连接

ALTER DATABASE TargetDB SET OFFLINE WITH ROLLBACK IMMEDIATE 


同意@gbn,您也可以使用以下代码成功恢复数据库

USE master 
GO

ALTER DATABASE YourDatabaseName SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO

ALTER DATABASE YourDatabaseName SET OFFLINE WITH ROLLBACK IMMEDIATE 
GO
但是,您可以使用以下脚本终止与选定数据库的连接

    -- 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
    )  

使用“master”数据库并运行此查询,它将终止您数据库中的所有活动连接。

那么此脚本是否会简单地终止所有连接的进程,并允许我立即恢复数据库?我是否只需要替换“testdb”条目?是的,这将终止特定数据库的所有进程。使用要还原的数据库的名称更改DB_ID函数中的数据库。
    -- 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
    )  
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 '+@pid)
FETCH NEXT FROM mycursor INTO @pid
END

CLOSE mycursor
DEALLOCATE mycursor
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