代码之家  ›  专栏  ›  技术社区  ›  Rob Garrison

SSMS中的权限问题:“对对象'extended_properties',数据库'mssqlsystem_resource'的选择权限被拒绝,…错误229)”

  •  17
  • Rob Garrison  · 技术社区  · 15 年前

    这里是最简单的repro情况。

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

    问题

    失败了 this error message .

    消息文本:

    标题:Microsoft SQL Server Management Studio
    无法检索此请求的数据。(microsoft.sqlserver.management.sdk.sfc)
    有关帮助,请单击: link
    其他信息:
    执行Transact-SQL语句或批处理时发生异常。 (microsoft.sqlserver.connectioninfo)连接信息
    对对象'extended_properties',database mssqlsystemresource',schema'sys'的选择权限被拒绝。(Microsoft SQL Server,错误:229)
    有关帮助,请单击: link

    这个用户 可以 访问表和表中的记录。但是用户 不能 访问对象资源管理器中的表列表。

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

    我找到的唯一解决办法是给用户高于必要的权限(如db_datareader)。

    问题是:

    什么是 最低限度 允许此用户在对象资源管理器中打开表列表所需的权限?

    我试图授予用户对dbo模式的各种特权,但这没有帮助。

    还要注意,我使用的SQL用户只是为了说明这个问题。最初的问题是广告用户。

    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
    
    5 回复  |  直到 15 年前
        1
  •  69
  •   akjoshi HCP    12 年前

    请检查一下你没有检查 db_denydatareader 数据库角色。去掉那张支票对我有好处。

        2
  •  9
  •   Cool Man    13 年前

    我也遇到了类似的问题,解决了这个问题,删除了用户的两个角色db_dyDataReader和db_dyDataWriter,并添加了其他角色。我使用了SQL Management Studio。

        3
  •  1
  •   Remus Rusanu    15 年前

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

    更改表对象

    您的登录测试应该将此权限作为测试表的所有者(它是所有者,对吗?)。但是,即使您没有表的权限,对扩展属性的查询也应该返回EMTPY结果集,而不是拒绝访问。在资源数据库中的sys对象上出现拒绝访问错误的事实表明系统资源数据库(mssqlsystemresource)的代码签名已中断。你有没有从师父那里丢掉任何一个证书?是否手动更改了资源数据库中的任何对象?

    不管怎样,现在您有一个看起来像已损坏的实例,我建议您联系产品支持部门,了解如何将其恢复到一致状态。

        4
  •  1
  •   Eric Weir    14 年前

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

        5
  •  0
  •   user7077707    7 年前

    通过用一个帐户创建SQL Server数据库,该帐户是所有者,并且具有所需的所有访问权限

    无需进一步增强权限。

    这种方法消除了这个线程可能出现的访问错误。 我在SSMS和Visual Studio(EF)中遇到了访问错误,使用Windows身份验证并使用管理员帐户创建了SQL Server数据库。

    我的实际解决方案是:

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

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

    (Visual Studio Xtra: 然后,在Visual Studio中,使用该帐户连接到SQL Server,并比较LocalDB(源)和SQL Server DB(目标)之间的架构。很好:目标数据库获取模式和数据内容)