本文介绍在 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