Разрешение EXECUTE запрещено для пользовательских типов таблиц?

87

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

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

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

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

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

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

Janez
источник
Спасибо! Я искал, но явно недостаточно хорошо: /
Janez
Попробуйте поставить AS dboв конце. Как это: GRANT EXEC ON TYPE::[schema].[typename] TO [User] AS dbo. Работал у меня.
Джонатан

Ответы:

197

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

GRANT EXEC ON TYPE::[schema].[typename] TO [User]
GO
mccow002
источник
9
Мои 2 цента: в зависимости от вашего механизма аутентификации соединения вам может потребоваться предоставить exec публичной группе. Итак, ваш грант будет выглядеть так: GRANT EXEC ON TYPE :: [schema]. [Typename] TO [Public] GO
Sudhanshu Mishra
@dotnetguy большое спасибо, у меня не сработало ни одно решение, кроме вашего.
Mazen el Senih
3

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

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

CREATE PROCEDURE dbo.usp_Demo
WITH EXECUTE AS SELF
rkw
источник
1
Спасибо за указание на это. Но в хранимой процедуре нет динамического sql. Только общие INSERT INTOоператоры таблиц и операторы «UPDATE», для которых этот пользователь имеет все необходимые права. Также этот пользователь / логин специально зарезервирован / создан для этого приложения ASP.NET, чтобы иметь возможность подключаться к этой базе данных и выполнять только хранимые процедуры (не создавать и т. Д., Создатель всегда 'sa').
Janez
Спасибо, это была проблема для меня. Другие читатели, столкнувшиеся с этой проблемой, могут обратиться к разделу «Разрешения SQL Server для хранимых процедур с динамическим SQL» для получения дополнительных советов.
Николай