使用只读用户访问 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 主数据库中的系统视图的主要内容,如果未能解决你的问题,请参考以下文章