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

У меня есть вопрос о типах таблиц, определяемых пользователем в 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 в окне свойств решает проблему, и хранимая процедура выполняется без проблем.


person Janez    schedule 29.07.2011    source источник
comment
благодарю вас! Я искал, но явно недостаточно: /   -  person Janez    schedule 29.07.2011
comment
Попробуйте поставить AS dbo в конце. Как это: GRANT EXEC ON TYPE::[schema].[typename] TO [User] AS dbo. Работал у меня.   -  person Jonathan    schedule 15.03.2013


Ответы (2)


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

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

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

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

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