设置 READ_Write 的含义

Rea*_*ces 2 sql-server t-sql sql-server-2012 locking read-only-database

我希望更新READ_ONLY数据库上的几个用户。
由于数据库在全球范围内 24/7 全天候使用,并且维护窗口刚刚过去,我想在活动量低的时刻执行此操作(以便能够遵守截止日期)。

我目前正在考虑使用:

USE MASTER
GO
ALTER DATABASE SQL SET READ_WRITE
GO
USE SQL
GO
EXEC sp_addrolemember N'db_datareader', N'USER'
GO
USE MASTER
GO
ALTER DATABASE SQL SET READ_ONLY
GO
Run Code Online (Sandbox Code Playgroud)

但是我想:

  1. 保证这不会无限期地挂起
  2. 确保在此操作期间不能将任何内容写入数据库

由于我无法将这些命令放入事务中,而且我在 DEV 或 STG 环境中没有方便的应用程序服务器来预先测试更改,是否有任何有关更改read_only单个操作状态的文档?(我确实测试了 T-SQL 语句,并且它们有效)

另外,由于这需要对数据库进行排他锁,我什至有可能通过我的语句吗?

我倾向于只是提出这将不得不等到下一个维护窗口期间。但我希望这里有人能证明我错了。

Aar*_*and 5

您可以将数据库设置为SINGLE_USER在执行更改时没有其他会话进入。此外,sp_addrolemember已被弃用;你应该ALTER ROLE改用。最后,请养成使用语句终止符的习惯。

USE master;
GO

ALTER DATABASE SQL SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE SQL SET READ_WRITE;
GO

USE SQL;
GO

ALTER ROLE db_datareader ADD MEMBER [USER];
GO

USE master;
GO

ALTER DATABASE SQL SET READ_ONLY;
ALTER DATABASE SQL SET MULTI_USER;
GO
Run Code Online (Sandbox Code Playgroud)