Проблема с разрешениями в SSMS: в разрешении SELECT было отказано для объекта «extended_properties», базы данных «mssqlsystem_resource», ошибка 229)

Вот самый простой из возможных вариантов.

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

Проблема

Ошибка с этим сообщением об ошибке >.

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

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

person Rob Garrison    schedule 04.01.2010    source источник
comment
Как я сказал ниже, я повторил это на SQL Server 2008 и столкнулся с той же проблемой. Я использую SSMS 2008 для подключения к обоим экземплярам.   -  person Rob Garrison    schedule 05.01.2010
comment
Вот еще одна ссылка, отчасти связанная с этим: support.microsoft.com/ default.aspx? scid = kb; EN-US; 956179. Однако это связано с открытием папки «Базы данных».   -  person Rob Garrison    schedule 05.01.2010
comment
На основе предложенного здесь (connect.microsoft.com/SQLServer/feedback/), я запустил трассировку и нашел точную команду, вызвавшую ошибку. Внутри этой более крупной команды была фактическая часть, вызывающая ошибку: выберите major_id из sys.extended_properties. См. Полную команду здесь: robsonlinereference.blogspot.com/2010/ 01 /. Это не единственная часть, которая может вызвать ошибку разрешений, но именно она вызывает эту конкретную ошибку разрешений.   -  person Rob Garrison    schedule 05.01.2010
comment
Могу я попросить вас проверить, решает ли приведенный ниже ответ Эльтигани проблему и для вас, и если да, то примите этот ответ?   -  person Nicolas    schedule 12.05.2017


Ответы (5)


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

person Eltigani    schedule 16.12.2012
comment
Спасибо ... Я проверяю deny_reader вместо reader ... пойди. - person namezero; 03.09.2014
comment
Это невероятно, я думал, что разрешение означает проверку всех элементов !! - person Emad; 03.11.2016

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

person Cool Man    schedule 29.06.2012

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

ALTER в таблице OBJECT

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

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

person Remus Rusanu    schedule 04.01.2010
comment
Спасибо за ответ, но я не думаю, что это проблема. Я просто повторил весь процесс на другом экземпляре и сервере, на этот раз с использованием SQL Server 2008. Я получил точно такую ​​же ошибку. (Я использую SSMS 2008 для подключения к обоим экземплярам.) - person Rob Garrison; 05.01.2010
comment
Также поймите, что я пытаюсь открыть папку «Таблицы», а не расширенные свойства конкретной таблицы. - person Rob Garrison; 05.01.2010
comment
Что касается вашего входа в систему, тест должен иметь это разрешение как владелец тестовой таблицы (он же владелец, верно?). Тестовый вход в систему SQL не является владельцем таблицы. База данных, логин и таблица были созданы логином со значительно более высокими привилегиями. - person Rob Garrison; 05.01.2010
comment
Ответы на конкретные вопросы в ответе: Я не сбрасывал ни одного сертификата '##' от мастера ни в одном из этих случаев. Я не изменял вручную какой-либо объект в базе данных ресурсов. - person Rob Garrison; 05.01.2010
comment
Разрешение SELECT не позволяет просматривать расширенные свойства. Хотя SSMS не должен просто выдавать вам такую ​​ошибку. Мне нужно посмотреть на сервер, когда я возьму его в руки, прямо сейчас я просто записываю на свой телефон ... - person Remus Rusanu; 05.01.2010
comment
Спасибо, Ремус. См. Мой комментарий к вопросу о следе. Он точно показывает, какой запрос вызывает ошибку. - person Rob Garrison; 05.01.2010
comment
Решение: Ремус Русану был на правильном пути. Я работал над удалением всех общедоступных разрешений из наших баз данных приложений. В рамках этого анализа я отозвал целый список публичных разрешений для 119 [sys]. объекты (например, [sys]. [sysprotects], [sys]. [schemas]). Я подключился к нетронутому экземпляру SQL 2005 и перезапустил весь этот тест. На этот раз ошибки не было. Я не сузил его до точного разрешения, которое привело к сбою, но повторное предоставление этого набора разрешений для публики позволило решить проблему. Все еще не доволен общедоступными разрешениями, но он работает. - person Rob Garrison; 09.01.2010
comment
Также см. Соответствующую запись на сайте connect.microsoft.com: connect.microsoft. ru / SQLServer / feedback / - person Rob Garrison; 12.01.2010

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

person Eric Weir    schedule 24.09.2010

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

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

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

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

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

затем войдите в систему SSMS с этой учетной записью (которая имеет разрешения «create db any» на главном сервере) - для создания (пустой) базы данных

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

person user7077707    schedule 29.01.2018