В разрешении EXECUTE отказано для пользовательских типов таблиц? - PullRequest
80 голосов
/ 29 июля 2011

У меня есть вопрос о определяемых пользователем типах таблиц в SQL Server 2008.

Для нужд одного из приложений ASP.NET мы определили наши собственные типы таблиц в SQLServer 2008 для использования их в качестве параметров в хранимых процедурах (при выполнении команды sql в приложении ASP.NET мы передаем объект DataTable в качестве параметра для хранимой процедуры , см. Здесь пример )

Проблемав том, что когда мы запускаем команду Sql (выполнить хранимую процедуру) из ASP.NET, мы получаем ошибку:

Отказано в разрешении EXECUTE для объекта 'ourTableType', базы данных 'ourDatabase', схемы 'ourSchema'.

Почему это так?Зачем нам нужно устанавливать разрешения для пользовательских типов таблиц?Почему недостаточно иметь разрешение, установленное только для хранимой процедуры, которая его использует?И если нам нужно установить его, несмотря ни на что, почему нет никакого EXECUTE типа разрешения для установки в окне свойств вообще (я вижу только Control, References, Take Ownership, View Definition)?

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

Ответы [ 2 ]

176 голосов
/ 02 ноября 2011

Я действительно надеюсь, что вы уже решили это, поскольку этому вопросу уже почти 4 месяца, но в случае, если вы этого не сделали, вот, что я думаю, это ответ.

GRANT EXEC ON TYPE::[schema].[typename] TO [User]
GO
3 голосов
/ 29 июля 2011

Если ваша хранимая процедура использует динамический sql, то есть @sql генерируется и затем выполняется с помощью exec @sql, вам потребуется разрешение для базовых таблиц.

Один способ -1005 * изменить хранимую процедуру для запуска от имени другого пользователя .Если вы заставите его работать как SELF, он будет запущен под создателем хранимого процесса, что крайне опасно.Тем не менее, если у вас нет другого выбора:

CREATE PROCEDURE dbo.usp_Demo
WITH EXECUTE AS SELF
...