Проблема с разрешениями в SSMS: «Отказано в разрешении SELECT для объекта extended_properties, базы данных« mssqlsystem_resource », ... Ошибка 229)» - PullRequest
18 голосов
/ 05 января 2010

Вот самый простой вариант воспроизведения.

  1. Создать новую базу данных. (Я использую SQL 2005.)
  2. Создайте имя пользователя, пользователя SQL и таблицу в новой базе данных (см. Пример кода ниже).
  3. Запустите SSMS и откройте Object Explorer, войдя в систему как вновь созданный пользователь .
  4. Попытка открыть папку «Таблицы» в обозревателе объектов.

Проблема

Сбой с этим сообщением об ошибке .

Текст сообщения:

НАЗВАНИЕ: 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

Ответы [ 5 ]

72 голосов
/ 16 декабря 2012

Убедитесь, что вы не проверяли db_denydatareader роль БД. Сняв этот чек, он заработал для меня.

9 голосов
/ 30 июня 2012

У меня была похожая проблема, и я решил ее, удалив две роли db_denydatareader и db_denydatawriter для этого пользователя и добавив другие роли. Я использовал sql management studio.

1 голос
/ 24 сентября 2010

У меня была похожая проблема. Я решил это, добавив пользователя в публичную роль. Но если вы не хотите этого делать, я также обнаружил, что это можно решить, предоставив пользователю разрешение на просмотр свойств sys.extended-properties (в системных представлениях в базе данных, к которой вы пытаетесь обратиться)

1 голос
/ 05 января 2010

SSMS пытается получить расширенные свойства таблицы, используя fn_listextendedproperty. Согласно MSDN необходимые разрешения для просмотра расширенных свойств таблицы:

ALTER на столе ОБЪЕКТ

Ваш тестовый логин должен иметь это разрешение как владелец тестовой таблицы (это владелец, верно?). Но даже если у вас нет прав доступа к таблице, запрос расширенных свойств должен возвращать набор результатов emtpy, а не доступ запрещен. Тот факт, что вы получаете ошибку отказа в доступе к объекту sys в базе данных ресурсов, указывает на то, что подпись кода базы данных системных ресурсов (mssqlsystemresource) нарушена. Вы сбросили какой-либо из сертификатов ## от мастера? Вы вручную изменили какой-либо объект в базе данных ресурсов?

В любом случае, у вас есть нечто, похожее на поврежденный экземпляр, и я бы порекомендовал вам обратиться в службу поддержки продукта, чтобы узнать, как вернуть его в согласованное состояние.

0 голосов
/ 29 января 2018

«Создавая базу данных SQL-сервера с учетной записью, эта учетная запись является владельцем и имеет все необходимые права доступа»

Нет необходимости в дополнительных улучшениях в разрешениях.

Этот подход удалил ошибку доступа, о которой этот поток кажется. Я столкнулся с ошибкой доступа в SSMS, а также в Visual Studio (EF), используя проверку подлинности Windows и создав базу данных SQL-сервера с учетной записью администратора.

Практическим решением для меня было:

SSMS> запуск от имени администратора, вход на сервер sql: с аутентификацией Windows - НЕ создавать базу данных SQL сервера - но чтобы дать учетной записи разрешение «создать любую базу данных» на «master»

затем вход в систему SSMS с этой учетной записью (у которой есть права на создание базы данных на мастере) - создать (пустую) базу данных

(VISUAL STUDIO xtra: Затем в Visual Studio подключитесь к серверу sql с этой учетной записью и сравните схемы между LocalDB (источник) и сервером sql db (цель). хорошо работает: целевая БД получает схему и содержимое данных)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...