不应在 SQL Server 中的 msdb 数据库中禁用来宾用户

本文介绍在 SQL Server 中禁用 msdb 数据库中的来宾用户时可能发生的各种问题。

原始产品版本:SQL Server
原始 KB 数: 2539091

在 msdb 数据库中禁用来宾用户时出现症状

为了使某些Microsoft SQL Server 功能正常工作,必须在 msdb 数据库中启用来宾用户。 本文介绍在 msdb 数据库中禁用来宾用户时可能会遇到的一些问题。 本文还提供了有关如何解决这些问题的信息。

在 msdb 数据库中禁用来宾用户时,当用户展开 Management Studio 中的“数据库”节点或服务器应用程序尝试连接到 SQL Server 时,你可能会收到错误 MSSQLSERVER_916 。 出现此问题时,你可能会遇到环境中的一个或多个以下症状。

注意

根据方案,错误的文本可能会略有不同。 但是,根本原因本质上是相同的。 导致 msdb 数据库中的权限不足。 当对象资源管理器尝试显示每个数据库的基于策略的管理状态时,会出现这些症状。 对象资源管理器使用当前登录的权限来查询 msdb 数据库以获取此信息,这会导致错误。

症状 1

在 SQL Server 2012 及更高版本中,如果某个用户不是 SQL Server 中 Sysadmin 固定服务器角色的成员,但在 msdb 中未授予适当的权限,则会尝试展开数据库节点或该节点下的任何文件夹时,他们会收到类似于以下内容的错误消息:

无法显示请求的对话。 其他信息:无法显示请求的对话。 (SqlMgmt)执行 Transact-SQL 语句或批处理时发生异常。 (Microsoft.SqlServer.ConnectionInfo)

服务器主体 <用户名> 无法访问当前安全上下文下的数据库 msdb。 (Microsoft SQL Server,错误:916)

症状 2

在 SQL Server 2008 和 SQL Server 2008 R2 环境中,如果某个用户不是 SQL Server 中的 Sysadmin 固定服务器角色的成员,但在 msdb 中未授予适当的权限,则会尝试扩展数据库节点或该节点下的任何文件夹时,他们会收到如下所示的错误消息:

无法为此请求检索数据。 (Microsoft.SqlServer.Manager.Sdk.Sfc)
其他信息:
执行 Transact-SQL 语句或批处理时发生了异常。
(Microsoft.SqlServer.ConnectionInfo)
服务器主体 <Servername> 无法访问当前安全上下文下的数据库“msdb”。 (Microsoft SQL Server,错误:916)

注意

展开数据库节点只是需要来宾帐户连接到 msdb 数据库的权限的活动之一。 任何至少需要访问 msdb 数据库的活动都会出现类似的错误。

如何确定问题

若要确定来宾用户是否已在 msdb 数据库中正确配置,请以 sysadmin 固定服务器角色的成员身份运行以下查询:

USE msdb;

SELECT prins.name AS grantee_name, perms.*

FROM sys.database_permissions AS perms

JOIN sys.database_principals AS prins

ON perms.grantee_principal_id = prins.principal_id

WHERE prins.name = 'guest' AND perms.permission_name = 'CONNECT';

GO

如果收到类似于以下内容的结果集,则来宾用户具有必要的权限。

grantee_name class class_desc major_id minor_id grantee_principal_id grantor_principal_id type permission_name state state_desc
来宾 0 DATABASE 0 0 2 1 CO CONNECT G GRANT

如果收到空结果集,或者如果 state_desc 此处提到的结果集中显示 DENY,则会在 msdb 数据库中禁用来宾用户。 连接到数据库时,可能会收到错误 916。

如何解决问题

若要解决此问题,请在 SQL Server Management Studio 中以 sysadmin 固定服务器角色的成员身份运行以下查询:

USE msdb;

GRANT connect TO guest;

GO

参考