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

时间:2019-08-05 12:26:27

标签: sql-server sql-server-2008 sql-server-2012 sql-server-2008-r2

我在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行。

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

enter image description here

由于只读用户帐户没有'sysadmin'角色,因此仅显示一行。

如果我为只读用户帐户设置了“ sysadmin”角色,它将显示所有行(而不是以前的任何一行)。

1 个答案:

答案 0 :(得分:0)

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

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