SQL Server 2008 предоставляет разрешение для information_schema.columns - PullRequest
8 голосов
/ 05 августа 2010

У меня есть ряд хранимых процедур, которые выбирают данные из БД.У меня есть роль (cctc_reader), которая имеет разрешения на выполнение, предоставленные для процедур.Одна из процедур вызывает другую хранимую процедуру с именем recControl_system_option, которая в свою очередь запрашивает Information_schema.columns.

Проблема в том, что в этом процессе запрос

select column_name from information_schema.columns where table_name = 'recControl_manager'

не возвращает никаких записей.cctc_reader имеет права на:

  • каждый выбранный процесс
  • recControl_system_option

, поэтому теоретически это должно работать.У меня нет проблем при запуске под dbo.

Если я предоставляю db_datareader для cctc_reader, запрос в порядке, но я не хочу предоставлять разрешения на чтение для всех таблиц (поэтому я и использовал хранимые процедуры).Я попытался предоставить разрешения Select для Information_schema в Master db, как предлагалось в некоторых статьях, но все еще не могу заставить это работать.

Есть предложения?

Ответы [ 3 ]

6 голосов
/ 05 августа 2010

Видимость метаданных объектов зависит от разрешения VIEW DEFINITION :

GRANT VIEW DEFINITION ON ... TO cctc_reader;

Разрешение VIEW DEFINITION позволяет Пользователь видит метаданные защищаемого на что дается разрешение. Тем не менее, разрешение VIEW DEFINITION не предоставляет доступ к сам по себе Например, пользователь это дается только ПОКАЗАТЬ ОПРЕДЕЛЕНИЕ разрешение на таблицу можно увидеть метаданные связанные с таблицей в Представление каталога sys.objects. Тем не мение, без дополнительных разрешений, таких как ВЫБРАТЬ или УПРАВЛЯТЬ, пользователь не может читать данные из таблицы.

Право на получение разрешения зависит от вашего сценария. Это может быть dbo или какая-то другая схема, это может быть сама база данных, это могут быть отдельные таблицы. Если бы я был на вашем месте, я бы код подписал процедуру recControl_system_option и предоставил бы VIEW ANY DEFINITION для подписи на уровне сервера, гораздо лучший и безопасный способ использования ролей и предоставления разрешения на роли. См. Подписание активированной процедуры для примера того, как подписать процедуру и предоставить разрешение уровня сервера для подписи.

2 голосов
/ 05 августа 2010

Как уже упоминал Ремус, видимость метаданных влияет на данные, возвращаемые при запросе системных таблиц и представлений. Если у вас нет прав на защищаемый объект (объект, логин и т. Д.), Он не будет виден.

В зависимости от вашей ситуации, вы позволите внутреннему вызову иметь EXECUTE AS OWNER или обернуть Information_schema.columns в udf, что EXECUTE AS OWNER

Мы используем эту технику, когда мы запрашиваем метаданные.

0 голосов
/ 22 июня 2018

Найдя это в другом месте, создайте sproc, который вызывает System sproc sp_columns в вашей базе данных. Ваш sproc может выполняться с теми же разрешениями, что и другие sprocs. Недостатком является то, что в возвращаемом наборе есть много столбцов, которые, вероятно, вас не интересуют. Полагаю, вы могли бы уточнить sproc. Я решил сделать выбор поля в коде.

CREATE PROCEDURE [dbo].[proc_tblMyTableSchemaGet] 

AS НАЧАТЬ

SET NOCOUNT ON;


exec sp_columns @table_name = 'myTable', @table_owner = 'dbo';

END

...