1

我有一个在我的数据库 test_db 上设置了 db_datareader 数据库角色的帐户。

使用 SSMS 我使用此帐户(使用 SQL Server 身份验证)登录并打开一个新的查询窗口,以便通过执行以下查询来获取与 test_db 数据库的当前连接数:

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

其中 database_id = 6 对应于 test_db。

此查询返回单行而不是多行。

但是,从 SSMS 如果我使用没有设置 db_datareader 的另一个帐户(使用 Windows 身份验证)登录,如果我从 SSMS 打开一个新的查询窗口并键入上面指示的相同查询,我将获得与 test_db 数据库的所有当前连接(更多超过一排)。

为什么?我需要获取到 test_db 数据库的所有当前连接,而不仅仅是当前用户登录的单个连接(具有 db_datareader 数据库角色集的只读帐户)

4

2 回答 2

0

最后,我通过授予 VIEW SERVER STATE 权限来解决只读用户的问题,如此所述。

SQL Server 没有返回所有行的问题是因为只读用户没有看到 SQL Server 实例上的所有正在执行的会话。只读用户只看到当前会话。因此,为只读用户设置 VIEW SERVER STATE 是可行的。

于 2019-08-26T07:43:10.550 回答
0

由于您希望返回信息的 SQL 用户没有适当的权限,因此您需要创建一个存储过程并使用EXECUTE AS

CREATE PROCEDURE dbo.GetConnectedUsers  
WITH EXECUTE AS 'sa'  
AS  
    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 
GO 

显然,您还需要为您使用的有限用户帐户提供对存储过程的执行权限

于 2019-08-09T02:55:21.150 回答