使用只读用户访问 SQL Server 主数据库中的系统视图

Posted

技术标签:

【中文标题】使用只读用户访问 SQL Server 主数据库中的系统视图【英文标题】:Accessing system views in master database in SQL Server using readonly user 【发布时间】:2019-08-05 12:26:27 【问题描述】:

我在 SQL Server 中创建了一个用户,该用户只能以只读模式访问 2 个数据库,因此我为该用户分配了角色 db_datareader。

现在我需要这个用户可以访问 master 数据库中的系统视图,以便执行以下查询:

select * FROM sys.databases sd LEFT JOIN sys.sysprocesses sp ON sd.database_id = sp.dbid 
WHERE database_id = 6 AND LOGINAME IS NOT NULL

所以我已使用 db_datareader 角色授予对主数据库的访问权限,因此用户只能对该数据库具有只读访问权限。

此外,我需要在 master 数据库中授予 sysadmin 服务器角色,以便此查询适用于该用户。我想知道这是否是正确的方法。或者还有其他更好的方法吗?授予 sysadmin 服务器角色听起来不太好...

更新

我在下面创建了存储过程。如果我使用只读用户登录 Sql Server Management Studio 并按如下方式调用存储过程,则会收到消息错误:

exec [mySchema].[spGetNumberOfCurrentConnections] 


CREATE PROCEDURE [mySchema].[spGetNumberOfCurrentConnections] 
WITH EXECUTE AS 'dbo'
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    select * FROM sys.databases sd LEFT JOIN sys.sysprocesses sp ON sd.database_id = sp.dbid 
    WHERE database_id = 6 AND LOGINAME IS NOT NULL
END

错误

The EXECUTE permission was denied on the object 'spGetNumberOfCurrentConnections', database 'myDatabase', schema 'mySchema'.

更新 2

我已授予只读用户存储过程的 EXECUTE 权限。现在存储过程执行,但它只返回 1 行,这是不正确的,因为它应该返回至少 100 行。

如图所示,我已授予用户对存储过程的权限:

由于只读用户帐户没有“系统管理员”角色,它只显示一行。

如果我为只读用户帐户设置“系统管理员”角色,它会显示所有行(而不是像以前那样单行)。

【问题讨论】:

创建sysadmin 帐户意味着他们可以做任何事情,db_datareader 角色的成员身份毫无意义。考虑使用EXECUTE AS 和/或证书创建一个存储过程来检索您需要的特定数据。请参阅this 进行更深入的讨论。 为什么要标记 3 个不同版本的 SQL Server(其中 2 个完全不支持)? @Larnu 仅仅因为某个版本不受支持并不意味着客户不再使用它。我向您保证,仍然使用 SQL2008 的用户比例比您想象的要大。 我并没有说人们没有使用它@Greg(实际上有多少人仍在使用它,更令人震惊的是不知道它不受支持的数量),但是事实上,OP 在这里标记了 3 个不同的版本。 2012 的功能与 2008(R2) 的功能完全不同,这也是我问的原因。 @JeroenMostert 我已经更新了我的帖子,我创建了一个存储过程,我尝试使用“执行为”来执行它,但我收到了错误提示。 【参考方案1】:

为只读用户设置 View SERVER STATE 权限有效。

问题在于用户只看到当前会话,而不是 SQL Server 实例上所有正在执行的会话。

【讨论】:

以上是关于使用只读用户访问 SQL Server 主数据库中的系统视图的主要内容,如果未能解决你的问题,请参考以下文章

sql server 高可用日志传送

SQL Server 始终开启 - 辅助索引

sql server 2014 alwayson 可用性组 特性

高可用性副本 SQL Server 2014 中的只读意图

是否可以在 SQL Server 中创建只读同义词?

SQL SERVER数据库权限分配