SSMS中的权限问题:“对象'extended_properties',数据库'mssqlsystem_resource',...错误229拒绝了SELECT权限”

时间:2010-01-04 22:35:02

标签: sql-server security tsql permissions ssms

这是最简单的责任案例。

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

    this error message 失败。

    消息文字:

    TITLE:Microsoft SQL Server Management Studio
    无法检索此请求的数据。 (Microsoft.SqlServer.Management.Sdk.Sfc)
    如需帮助,请点击:link
    其他信息:
    执行Transact-SQL语句或批处理时发生异常。 (Microsoft.SqlServer.ConnectionInfo)
    对象'extended_properties',数据库mssqlsystemresource',schema'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
    

5 个答案:

答案 0 :(得分:71)

请检查您是否未检查db_denydatareader数据库角色。通过删除该检查,它对我有用。

答案 1 :(得分:9)

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

答案 2 :(得分:1)

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

  

表OBJECT上的ALTER

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

无论如何,此时你看起来像是一个损坏的实例,我建议你联系产品支持,了解如何让它恢复到连贯的状态。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

无需进一步增强权限。

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

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

SSMS>以管理员身份启动,sql server登录:使用Windows身份验证 - 不要创建SQL服务器数据库 - 但要在'master'上为'master'创建一个'create db any'权限

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

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