2010-09-28 4 views
7

У меня есть база данных, где весь доступ контролируется хранимыми процедурами. Администратор баз данных хотел бы избежать предоставления пользователям прямого доступа для чтения/записи к базовым таблицам, которые я могу понять. Следовательно, все обновление и выбор данных осуществляется с помощью хранимых процедур. В основном он создал одну роль, которая имеет EXECUTE разрешения для всех хранимых процедур в базе данных и предоставила пользователям эту роль.Разрешения при использовании «Execute sp_Executesql»

Проблема заключается в том, что одна из хранимых процедур динамически создает запрос SQl и выполняет его через «Execute sp_Executesql». Не вдаваясь в подробности, запрос создается динамически, поскольку он значительно изменяется в зависимости от многих пользовательских параметров ввода. Хранимая процедура, о которой идет речь, является только оператором SELECT sql, однако я считаю, что просто предоставить хранимую процедуру EXECUTE-разрешения недостаточно. В базовых таблицах, на которые делается ссылка в хранимой процедуре, использующей «Execute sp_Executesql», должен быть предоставлен доступ к «datareader», иначе хранимая процедура завершится с ошибкой.

Любые мысли о том, как исправить это? Я действительно хотел ограничить доступ к таблицам только хранимыми процедурами, но мне нужно найти способ обойти хранимые процедуры, которые используют «Execute sp_Executesq» l. Спасибо.

+0

Вы можете получить более avdice Serverfault. Мой совет. Поговорите с двой и объясните ситуацию. Работайте с ними, чтобы получить права. –

ответ

-3

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

+1

-1 sp_Executesql уже имеет открытый запуск. «Требуется членство в общественной роли». http://msdn.microsoft.com/en-us/library/ms188001.aspx. Реальная проблема заключается в разрыве цепочек прав собственности при использовании sp_executesql. См. это http://stackoverflow.com/questions/3815411 – gbn

+1

Если вы упрочили свою базы данных для блокировки публичной роли, тогда @ MAW74656 является правильным; например, вы создали пользовательскую роль для замены публичной роли и удалили все привилегии публично. Да, это противоречит документированным требованиям, но системы сканирования с упрощенной базой данных, такие как AppDetective (через SQL Server STIG), представляют собой публичную роль и ее открытый доступ по умолчанию в качестве основного риска. – Draghon

+0

... кроме того, цитируя ту же самую статью MSDN, «Записанные во времени инструкции Transact-SQL могут подвергать приложения вредоносным атакам». Это более заметно отображается, чем утверждение «Требуется членство в публичной роли». – Draghon

12

В обертке прок вы можете использовать EXECUTE AS OWNER или EXECUTE AS SomeuserWithNoLogin

Это изменит контекст для входа на продолжительность хранимая процедура, которая включает в себя sp_executesql.

  • Если вы используете OWNER, он будет работать, потому что вы уже используете цепочку прав собственности.
  • Если ваш администратор базы данных (хороший человек!) Не хочет, чтобы вы работали как dbo, тогда настройте пользователя, который имеет полное чтение, но не имеет прав. EXECUTE AS <user> требуется запись является sys.database_principals

Как это:

CREATE USER SomeuserWithNoLogin WITH WITHOUT LOGIN 
EXEC sp_addrolemember 'db_datareader', 'SomeuserWithNoLogin' 

Для получения дополнительной информации см EXECUTE AS Clause on MSDN и CREATE PROCEDURE

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