Вот самый простой вариант воспроизведения.
- Создать новую базу данных. (Я использую SQL 2005.)
- Создайте имя пользователя, пользователя SQL и таблицу в новой базе данных (см. Пример кода ниже).
- Запустите SSMS и откройте Object Explorer, войдя в систему как вновь созданный пользователь .
- Попытка открыть папку «Таблицы» в обозревателе объектов.
Проблема
Сбой с этим сообщением об ошибке .
Текст сообщения:
НАЗВАНИЕ: Microsoft SQL Server Management Studio
Не удалось получить данные для этого запроса. (Microsoft.SqlServer.Management.Sdk.Sfc)
Для получения справки нажмите:
ссылка
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:
Возникла исключительная ситуация при выполнении оператора или пакета Transact-SQL.
(Microsoft.SqlServer.ConnectionInfo)
В доступе SELECT было отказано для объекта «extended_properties», базы данных mssqlsystemresource, схемы «sys». (Microsoft SQL Server, ошибка: 229)
Для получения справки нажмите:
ссылка
Этот пользователь может получить доступ к таблице и записи в таблице. Но пользователь не может получить доступ к списку таблиц в обозревателе объектов.
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