Параметр, оцененный таблицей в хранимой процедуре, получает разрешения на выполнение, отклоненные
Я получаю следующую ошибку при вызове хранимой процедуры, которая имеет параметр таблицы в качестве одного из параметров
Разрешение EXECUTE
было отклонено для объекта "ValidationErrors"
ValidationErrors - это TVP, созданный со следующим утверждением:
CREATE TYPE [dbo].[ValidationErrors] AS TABLE(
[ErrorMessage] [varchar](255) NOT NULL
)
Пользователь, выполняющий хранимую процедуру, имеет права на выполнение хранимой процедуры. Тем не менее, я все еще получаю вышеуказанную ошибку.
Любые идеи?
Ответы
Ответ 1
Я думаю, вам также может потребоваться предоставить пользователю права доступа к типу.
Ссылки для разрешений GRANTing для типов:
SQL 2005
SQL 2008
Update:
Re: почему вы должны предоставлять разрешения на тип, когда у вас есть разрешения на sproc.
Я не знаю окончательной причины, но BOL говорит:
В отличие от пользовательских типов, созданных используя sp_addtype, общедоступную базу данных роль автоматически не предоставляется ССЫЛКИ разрешает типы, которые создаются с использованием CREATE TYPE. Эта разрешение должно предоставляться отдельно.
Обновление 2:
Для разрешения GRANT EXECUTE вы запустите это в SSMS:
GRANT EXECUTE ON TYPE::dbo.ValidationErrors TO SomeUser;
Ответ 2
Как поясняет @chiefbrownbotom, причиной, по которой вам нужны разрешения на выполнение для типа таблицы, является то, что таблица создается до (и, следовательно, вне) вызова proc. Чтобы проиллюстрировать этот прогон трассировки SQL Profiler и вызвать ваш proc. Вы увидите нечто подобное, что может вас удивить...
DECLARE @p1 TABLE AS YourTableType
INSERT INTO @p1 (col1, col2, col3) VALUES ('val1','val2','val3')
INSERT INTO @p1 (col1, col2, col3) VALUES ('val1','val2','val3')
...
EXEC usp_YourStoredProc @p1
Ответ 3
Управление грантами в TYPE:: schema.mytabletype к RoleOrMember
Это сработало для меня; Большое спасибо @chiefbrownbotom в комментарии выше.