Вот самый простой из возможных вариантов.
- Создайте новую базу данных. (Я использую SQL 2005.)
- Создайте логин, пользователя SQL и таблицу в новой базе данных (см. Пример кода ниже).
- Запустите SSMS и откройте обозреватель объектов, войдя в систему как новый пользователь.
- Попытайтесь открыть папку «Таблицы» в проводнике объектов.
Проблема
Ошибка с этим сообщением об ошибке >.
Текст сообщения:
TITLE: Microsoft SQL Server Management Studio
Failed to retrieve data for this request. (Microsoft.SqlServer.Management.Sdk.Sfc)
For help, click: link
ADDITIONAL INFORMATION:
An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo)
The SELECT permission was denied on the object 'extended_properties', database mssqlsystemresource', schema 'sys'. (Microsoft SQL Server, Error: 229)
For help, click: 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