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