如何使用T-SQL检测SQL Server数据库的只读状态?

37

我需要知道如何查询Microsoft SQL Server,以查看特定数据库是否已设置为只读(Read-Only)

是否可以使用T-SQL来实现?

6个回答

45

这些信息存储在sys.databases中。

SELECT name, is_read_only 
FROM sys.databases 
WHERE name = 'MyDBNAme'
GO

--returns 1 in is_read_only when database is set to read-only mode.

43

只查询 sys.databases 来检查数据库的只读属性,仅当数据库被明确设为只读模式时才会提供正确的信息。

对于处于被动服务器(例如AlwaysOn技术的Secondary服务器)中的数据库,即使这些数据库不可写入,它们在 sys.databases 中的只读模式仍将设置为 False(0)

因此,建议使用以下语句检查数据库的只读模式:

SELECT DATABASEPROPERTYEX('MyDBNAme', 'Updateability');

这对我也适用,可以检查Azure数据库中的主要和次要。需要注意的是,返回的值为READ_ONLY和READ_WRITE。此外,在Azure中,如果从与传递给第一个参数的数据库名称不匹配的数据库查询,则结果将为NULL。 - Tim Friesen
3
这个在Azure上运行得很好:SELECT DATABASEPROPERTYEX(DB_NAME(), 'Updateability'); - Tim Friesen
将服务器名称添加到脚本中非常有用,特别是当您需要在多个服务器上尝试时。SELECT @@SERVERNAME AS ServerName, DATABASEPROPERTYEX('(databasename)', 'Updateability') AS Status; - AjV Jsy

8

我试图使用p.campbell的答案来检查我的Azure SQL数据库是主数据库还是只读副本-但它没有生效。主数据库和副本都在"is_read_only"字段上返回了0。

这是对我有用的方法:

SELECT DATABASEPROPERTYEX('MyDBNAme', 'Updateability'); 

以上的select语句返回字符串'READ_ONLY'或'READ_WRITE'。


6
这里有一个命令可以显示或设置此属性。
EXEC sp_dboption "AdventureWorks", "read only"

样例输出

OptionName CurrentSetting    
read only OFF

0
如果您想检查服务器中的所有数据库状态,请使用以下命令:
SELECT name, user_access_desc, is_read_only, state_desc, recovery_model_desc  
FROM sys.databases;

您可以快速确定下一步操作。


0
如果DB是你的Always On的一部分,并且辅助节点被设计为Read_Only,那么"sys.databases --> Is_Read_Only"列将不会显示正确的结果!这是一个微软需要在下一个版本中解决的错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接