这是最简单的责任案例。
消息文字:
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
答案 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)之间的模式。效果很好:目标数据库获取架构和数据内容)