我有一个SQL脚本备份数据库,然后将其还原到另一个数据库。我遇到的问题是被覆盖的数据库被用户锁定打开,因此作业失败。我可以手动杀死附加的用户,它运行正常,但我需要这个过程每晚自动运行。是否有一个杀戮命令我每晚都可以执行?或者还原选项中有什么东西可以做同样的事情吗?
有什么想法吗?
由于
答案 0 :(得分:6)
如果客户重新连接
,则KILL并不总是有效我会考虑使数据库脱机(或仅限dbo)然后恢复。因此将阻止进一步的重新连接。
ALTER DATABASE TargetDB SET OFFLINE WITH ROLLBACK IMMEDIATE
或
ALTER DATABASE TargetDB SET RESTRICTED_USER WITH ROLLBACK IMMEDIATE
答案 1 :(得分:1)
同意@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
)
答案 2 :(得分: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 '+@pid)
FETCH NEXT FROM mycursor INTO @pid
END
CLOSE mycursor
DEALLOCATE mycursor
答案 3 :(得分: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
使用'master'数据库并运行此查询,它将终止数据库中的所有活动连接。