【发布时间】:2011-01-01 10:42:30
【问题描述】:
这是最简单的复制案例。
- 创建一个全新的数据库。 (我使用的是 SQL 2005。)
- 在新数据库中创建登录名、SQL 用户和表(参见下面的示例代码)。
- 启动 SSMS 并打开对象资源管理器,以新创建的用户身份登录。
- 尝试在对象资源管理器中打开“表”文件夹。
问题
以 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