4

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

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

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

не возвращает никаких записей. cctc_reader имеет разрешения на получение грантов:

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

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

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

Любые предложения?

ответ

4

объектов видимости метаданных подлежит VIEW DEFINITION разрешения: разрешение Определение

GRANT VIEW DEFINITION ON ... TO cctc_reader; 

The View позволяет пользователю видеть метаданные защищаемых , на которых выдано разрешение. Однако разрешение VIEW DEFINITION не предоставляет доступ к защищенному объекту . Например, пользователь , которому предоставлено только разрешение VIEW DEFINITION , может видеть метаданные , относящиеся к таблице в представлении каталога sys.objects . Однако без дополнительных разрешений, таких как SELECT или CONTROL, пользователь не может читать данные из таблицы.

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

+0

Отлично! Спасибо за ввод.Я разработал, как это исправить, и вы дали мне много еды для размышлений ...! – pilsdumps

2

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

В зависимости от вашей ситуации, вы позволили бы внутренний вызов, что EXECUTE AS OWNER, или оберните INFORMATION_SCHEMA.COLUMNS в ОДС, что, как EXECUTE AS OWNER

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

Смежные вопросы