【问题标题】:Permissions issue in SSMS: "The SELECT permission was denied on the object 'extended_properties', database 'mssqlsystem_resource', ... Error 229)"SSMS 中的权限问题:“对象 'extended_properties'、数据库 'mssqlsystem_resource' 的 SELECT 权限被拒绝,...错误 229)”
【发布时间】:2011-01-01 10:42:30
【问题描述】:

这是最简单的复制案例。

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

问题

this error message 失败。

消息文本:

标题:Microsoft SQL Server Management Studio
未能为此请求检索数据。 (Microsoft.SqlServer.Management.Sdk.Sfc)
如需帮助,请点击:link
附加信息:
执行 Transact-SQL 语句或批处理时发生异常。 (Microsoft.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 用户。

Here 在 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 2008 上重试了这个并且遇到了同样的问题。我正在使用 SSMS 2008 连接到这两个实例。
  • 这里是另一个有点相关的链接:support.microsoft.com/default.aspx?scid=kb;EN-US;956179。但是,这与打开“数据库”文件夹有关。
  • 根据此处的建议 (connect.microsoft.com/SQLServer/feedback/…),我开始跟踪并找到导致错误的确切命令。在那个较大的命令内部是导致错误的实际部分:“从 sys.extended_properties 中选择major_id”。在此处查看完整的命令:robsonlinereference.blogspot.com/2010/01/…。这不是唯一会导致权限错误的部分,而是导致此特定权限错误的部分。
  • 我能否请您验证下面 Eltigani 的回答是否也为您解决了问题,如果是,请接受此回答?

标签: sql-server security tsql permissions ssms


【解决方案1】:

请检查您是否没有检查db_denydatareader DB 角色。通过删除该检查它对我有用。

【讨论】:

  • 谢谢...我检查deny_reader而不是阅读器...去图。
  • 太不可思议了,我认为授予权限意味着检查所有项目!
【解决方案2】:

我遇到了类似的问题,并通过删除该用户的两个角色 db_denydatareader 和 db_denydatawriter 并添加其他角色来解决这个问题。我用的是sql管理工作室。

【讨论】:

    【解决方案3】:

    SSMS 尝试使用fn_listextendedproperty 获取表的扩展属性。根据MSDN,查看表扩展属性所需的权限是

    表 OBJECT 上的 ALTER

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

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

    【讨论】:

    • 感谢您的回复,但我认为这不是问题所在。我只是在不同的实例和服务器上重试了整个过程,这次使用的是 SQL Server 2008。我得到了完全相同的错误。 (我正在使用 SSMS 2008 连接到这两个实例。)
    • 也明白我是在尝试打开“Tables”文件夹,而不是特定表的扩展属性。
    • 关于“你的登录测试应该有这个权限作为测试表的所有者(它是所有者,对吧?)。”:测试SQL登录不是表的所有者。数据库、登录名和表都是由具有更高权限的登录名创建的。
    • 回答中的具体问题:在这两种情况下,我都没有从 master 中删除任何 '##' 证书。我没有手动更改资源数据库中的任何对象。
    • 解决方案:Remus Rusanu 走在了正确的轨道上。我一直在努力从我们的应用程序数据库中删除所有公共权限。作为该分析的一部分,我撤销了对 119“[sys]”的整个公共权限列表。对象(例如,[sys].[sysprotects]、[sys].[schemas])。我连接到一个未触及的 SQL 2005 实例并重新运行整个测试。那个时候,没有错误。我没有将其范围缩小到使其失败的确切权限,但是将这组权限重新授予 public 使问题消失了。仍然对公共权限不满意,但它正在工作。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      “通过使用帐户创建 SQL 服务器数据库,该帐户是所有者并且拥有所有需要的访问权限”

      无需进一步增强权限。

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2010-09-25
        • 1970-01-01
        • 2013-01-10
        • 2014-08-16
        • 1970-01-01
        • 2018-03-27
        • 1970-01-01
        • 1970-01-01
        • 2011-03-27
        相关资源
        最近更新 更多