Ответ 1
Убедитесь, что вы не проверяли роль db_denydatareader
DB. Удалив эту проверку, она сработала для меня.
Вот самый простой возможный вариант.
Не удалось выполнить это сообщение об ошибке.
Текст сообщения:
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
Убедитесь, что вы не проверяли роль db_denydatareader
DB. Удалив эту проверку, она сработала для меня.
У меня была аналогичная проблема, и я решил, что удалив две роли db_denydatareader и db_denydatawriter для этого пользователя и добавлю другие роли. Я использовал студию управления sql.
SSMS пытается получить расширенные свойства таблицы, используя fn_listextendedproperty
. Согласно MSDN требуемые разрешения для просмотра расширенных свойств таблицы
ALTER на странице OBJECT
Ваш тест входа должен иметь это permsision как владелец тестовой таблицы (это владелец, правда?). Но даже если у вас нет прав на таблицу, запрос для расширенных свойств должен возвращать набор результатов emtpy, а не запрещать доступ. Тот факт, что вы получаете ошибку отказа в доступе к объекту sys в базе данных ресурсов, указывает на то, что подписание кода базы данных системных ресурсов (mssqlsystemresource) нарушено. Вы удалили какие-либо из "##" сертификатов от мастера? вы вручную изменили какой-либо объект в базе данных ресурсов?
В любом случае у вас есть что-то похожее на поврежденный экземпляр в данный момент, и я бы посоветовал вам связаться с продуктом о том, как вернуть его в согласованное состояние.
У меня была аналогичная проблема. Я разрешил это, добавив пользователя к публичной роли. Но если вы не хотели этого делать, я также обнаружил, что это можно решить, предоставив пользователю разрешение на представление sys.extended-properties (в системных представлениях в базе данных, к которой вы пытаетесь получить доступ)
"Создавая SQL-сервер db с учетной записью, эта учетная запись является владельцем и имеет весь необходимый доступ"
Нет необходимости в дополнительных улучшениях в разрешениях.
В этом подходе была удалена ошибка доступа, к которой относится этот поток. Я столкнулся с ошибкой доступа в SSMS, а также с Visual Studio (EF), используя проверку подлинности Windows и создав базу данных SQL-сервера с учетной записью администратора.
Практическое решение для меня было:
SSMS > запускается как администратор, вход в sql-сервер: с проверкой подлинности Windows - НЕ создавать SQL-сервер db - но предоставить учетную запись "create db any" на "master"
затем SSMS-вход в систему с этой учетной записью (которая имеет "создать db любые" разрешения для мастера) - создать (пустую) базу данных
(ВИЗУАЛЬНАЯ СТУДИЯ xtra: затем в visual studio подключитесь к серверу sql с этой учетной записью и сравните схему между LocalDB (source) и SQL-сервером db (target). хорошо работает: целевой db получает содержимое схемы и данных)