У меня вопрос о типах таблиц, определяемых пользователем в 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
в окне свойств решает проблему, и хранимая процедура выполняется без проблем.
AS dbo
в конце. Как это:GRANT EXEC ON TYPE::[schema].[typename] TO [User] AS dbo
. Работал у меня.Ответы:
Я действительно надеюсь, что вы уже решили эту проблему, поскольку этому вопросу уже почти 4 месяца, но если вы еще этого не сделали, вот что, я думаю, является ответом.
GRANT EXEC ON TYPE::[schema].[typename] TO [User] GO
источник
Если ваша хранимая процедура использует динамический sql, то
@sql
есть создается, а затем выполняется черезexec @sql
, вам потребуется разрешение, предоставленное для базовых таблиц.Один из способов решения проблемы - изменить хранимую процедуру для запуска от имени другого пользователя . Если вы запустите его как SELF, он будет запускаться от имени создателя сохраненной процедуры, что чрезвычайно опасно. Тем не менее, если у вас нет другого выхода:
CREATE PROCEDURE dbo.usp_Demo WITH EXECUTE AS SELF
источник
INSERT INTO
операторы таблиц и операторы «UPDATE», для которых этот пользователь имеет все необходимые права. Также этот пользователь / логин специально зарезервирован / создан для этого приложения ASP.NET, чтобы иметь возможность подключаться к этой базе данных и выполнять только хранимые процедуры (не создавать и т. Д., Создатель всегда'sa'
).