我有一个SQL脚本,它备份一个数据库,然后在另一个数据库上恢复它。我遇到的问题是,正在被覆盖的数据库被用户锁定为打开状态,因此作业失败。我可以手动杀死附加的用户,它运行良好,但我需要这个进程自动运行每晚。有可以让我每晚定时执行的kill命令吗?或者,在还原选项中是否有什么东西可以执行相同的操作?
有什么想法吗?
谢谢
发布于 2011-06-23 16:54:02
如果客户端重新连接,KILL并不总是有效的
我会考虑让数据库离线(或者只使用dbo ),然后再进行恢复。因此将阻止进一步的重新连接。
ALTER DATABASE TargetDB SET OFFLINE WITH ROLLBACK IMMEDIATE 或
ALTER DATABASE TargetDB SET RESTRICTED_USER WITH ROLLBACK IMMEDIATE 发布于 2011-06-23 16:59:24
同意@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
) 发布于 2011-06-23 17:01:40
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 mycursorhttps://stackoverflow.com/questions/6451512
复制相似问题