SSMS 中的权限问题:“对象‘extended_properties’、数据库‘mssqlsystem_resource’的 SELECT 权限被拒绝,...错误 229)”

问题描述 投票:0回答:6

这是最简单的重现案例。

  1. 创建一个全新的数据库。 (我使用的是 SQL 2005。)
  2. 在新数据库中创建登录名、SQL 用户和表(请参阅下面的示例代码)。
  3. 启动 SSMS 并打开对象资源管理器,以新创建的用户身份登录
  4. 尝试在对象资源管理器中打开“Tables”文件夹。
问题

失败并显示

此错误消息

留言内容:

标题:Microsoft SQL Server Management Studio
无法检索此请求的数据。 (微软.SqlServer.管理.Sdk.Sfc)
如需帮助,请点击:
link 附加信息:
执行 Transact-SQL 语句或批处理时发生异常。 (微软.SqlServer.ConnectionInfo)
对对象“extended_properties”、数据库“mssqlsystemresource”、架构“sys”的 SELECT 权限被拒绝。 (Microsoft SQL Server,错误:229)
如需帮助,请点击:
link
该用户

可以访问表以及表中的记录。但用户无法访问对象资源管理器中的表列表。

SELECT USER_NAME() AS CurrentUser, col1 FROM dbo.TestTable CurrentUser col1 ----------- ---- robg_test 1000

我发现的唯一解决方法是给予用户高于必要的权限(如 db_datareader)。

问题:

允许该用户在对象资源管理器中打开表列表所需的

最低权限是什么?

我尝试授予用户对 dbo 架构的各种权限,但这没有帮助。

另请注意,我使用 SQL 用户只是为了说明问题。最初的问题出在 AD 用户身上。

这里是serverfault上一个相对类似的问题。


代码

SET NOCOUNT ON USE master GO IF EXISTS (SELECT * FROM sys.server_principals WHERE name = N'robg_test') DROP LOGIN [robg_test] GO CREATE LOGIN [robg_test] WITH PASSWORD = N'CLK63!!black', DEFAULT_DATABASE = [RGTest], DEFAULT_LANGUAGE = [us_english], CHECK_EXPIRATION = OFF, CHECK_POLICY = ON GO IF EXISTS (SELECT * FROM sys.databases WHERE name = 'RGTest') DROP DATABASE [RGTest] GO CREATE DATABASE [RGTest] GO USE [RGTest] GO CREATE USER [robg_test] FOR LOGIN [robg_test] WITH DEFAULT_SCHEMA = [dbo] GO CREATE TABLE dbo.TestTable (col1 int) GO GRANT SELECT ON dbo.TestTable TO [robg_test] GO INSERT INTO dbo.TestTable VALUES (1000) GO
    
sql-server security t-sql permissions ssms
6个回答
91
投票
请检查您是否没有选中

db_denydatareader

数据库角色。通过删除该检查,它对我有用。


10
投票
我遇到了类似的问题,并通过删除该用户的两个角色 db_denydatareader 和 db_denydatawriter 并添加其他角色来解决该问题。我用的是sql management studio。


1
投票
SSMS 尝试使用

fn_listextendedproperty

 获取表的扩展属性。根据 MSDN,查看表的扩展属性所需的权限是 

更改表对象

您的登录测试应该作为测试表的所有者拥有此权限(它是所有者,对吧?)。但即使您没有表的权限,扩展属性的查询也应该返回空结果集,而不是拒绝访问。事实上,您在资源数据库中的 sys 对象上收到访问被拒绝错误,这表明系统资源数据库 (mssqlsystemresource) 的代码签名已损坏。您是否丢失了 master 的任何“##”证书?您是否手动更改了资源数据库中的任何对象?

无论如何,此时您的实例看起来像是损坏的,我建议您联系产品支持以了解如何将其恢复到一致状态。


1
投票
我也有类似的问题。我通过将用户添加到公共角色来解决它。但如果您不想这样做,我还发现可以通过向用户授予视图 sys.extended-properties 的权限来解决这个问题(在您尝试访问的数据库内的系统视图中)


0
投票
“通过使用帐户创建 SQL Server 数据库,该帐户就是所有者并拥有所有所需的访问权限”

无需进一步增强权限。

这种方法消除了该线程似乎涉及的访问错误。 我在 SSMS 以及 Visual Studio (EF) 中遇到访问错误,使用 Windows 身份验证并使用管理员帐户创建 SQL Server 数据库。

对我来说实用的解决方案是:

SSMS > 以管理员身份启动,sql server 登录:使用 Windows 身份验证 - 不创建 SQL Server 数据库 - 但要授予帐户“master”上的“create db any”权限

然后使用该帐户登录 SSMS(在 master 上具有“create db any”权限) - 创建(空)数据库

(视觉工作室xtra: 然后,在 Visual Studio 中,使用该帐户连接到 sql server,并比较 LocalDB(源)和 sql server db(目标)之间的架构。效果很好:目标数据库获取架构和数据内容)


0
投票
我只需通过管理员登录即可解决问题。例如。右键单击 SSMS 图标 -> 单击以管理员身份运行 -> 在对象导航器中登录(例如 Windows 登录)后附加数据库(例如 Adventure Works 2022),它会成功附加。如果您在没有管理员的情况下正常登录,则会看到以下内容。无法检索此请求的数据。 (Microsoft.SqlServer.Management.Sdk.Sfc

© www.soinside.com 2019 - 2024. All rights reserved.