Set read_committed_snapshot On for Databases in an Availability Group

通常为数据库开启read_committed_snapshot需要将数据库设置为单用户模式来关闭数据库上的连接,但是如果数据库在alwayson集群中时,无法运行set single_user,测试发现只要主节点上的数据库没有任何的连接(不需要关心副节点),就能运行set read_committed_snapshot on

那么我们可以通过kill把数据库上的所有连接断掉

use master
go

declare @execSql varchar(1000), @databaseName varchar(100)
-- Set the database name for which to kill the connections
set @databaseName = 'test'
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)

为了防止程序自动连接,可以先将访问数据库的用户权限去除,在操作完成后,再将用户权限加回去。

我这里实际操作没有使用kill,而是通过去除用户权限,连接就直接断了

USE [test]
GO
DROP USER [test1]
GO

USE [master]
GO
ALTER DATABASE [test] SET READ_COMMITTED_SNAPSHOT ON WITH NO_WAIT
GO

USE [test]
GO
CREATE USER [test1] FOR LOGIN [test1]
GO
ALTER ROLE [db_datareader] ADD MEMBER [test1]
GO
ALTER ROLE [db_datawriter] ADD MEMBER [test1]
GO

 

posted @ 2018-07-25 09:40  问&路  阅读(736)  评论(0编辑  收藏  举报