这是最简单的重现案例。
留言内容:
标题: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 用户身上。
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
db_denydatareader
数据库角色。通过删除该检查,它对我有用。
更改表对象您的登录测试应该作为测试表的所有者拥有此权限(它是所有者,对吧?)。但即使您没有表的权限,扩展属性的查询也应该返回空结果集,而不是拒绝访问。事实上,您在资源数据库中的 sys 对象上收到访问被拒绝错误,这表明系统资源数据库 (mssqlsystemresource) 的代码签名已损坏。您是否丢失了 master 的任何“##”证书?您是否手动更改了资源数据库中的任何对象?
无论如何,此时您的实例看起来像是损坏的,我建议您联系产品支持以了解如何将其恢复到一致状态。
无需进一步增强权限。
这种方法消除了该线程似乎涉及的访问错误。 我在 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(目标)之间的架构。效果很好:目标数据库获取架构和数据内容)