我在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'角色,因此仅显示一行。
如果我为只读用户帐户设置了“ sysadmin”角色,它将显示所有行(而不是以前的任何一行)。
答案 0 :(得分:0)
为只读用户设置ViEW SERVER STATE权限有效。
问题是用户仅看到当前会话,而不是SQL Server实例上的所有正在执行的会话。