SQL Server 2008 Не удается найти объект - PullRequest
1 голос
/ 27 июля 2010

Я создал несколько таблиц и хранимых процедур.Существует логин, назначенный роли, которая имеет разрешение на выполнение.Для всех хранимых процедур, кроме 2, все работает просто отлично.Но для 2 из них я получаю следующую ошибку:

Сообщение 15151, Уровень 16, Состояние 1, Процедура XX, Строка 15
Не удается найти объект 'XX', поскольку он несуществует или у вас нет разрешения.

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

Я смотрю на это уже пару дней и никуда не денусь.Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

1 голос
/ 29 июля 2010

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

1 голос
/ 03 ноября 2014

Я просто столкнулся с той же проблемой и нашел решение (для моего случая): у меня был оператор GRANT EXECUTE ..., следующий за SQL-кодом для создания процедуры.Добавление оператора GO - после кода процедуры, но до того, как оператор GRANT решил проблему.

Объяснение: Код GRANT EXECUTE был интерпретирован как часть хранимой процедуры, поэтому пользователь, у которого не было правПредоставить это разрешение получил вышеуказанное сообщение об ошибке.Член группы sysadmin может выполнить процедуру без сообщения об ошибке.Но пользователь, имеющий только разрешение на выполнение процедуры, получил сообщение об ошибке.

Я также заметил, что все операторы в процедуре были выполнены (вставив print-Statments в различные позиции в процедуре).

Надеюсь, это поможет некоторым из вас: -)

1 голос
/ 27 июля 2010

Пара вещей, которые нужно проверить.

Во-первых, если у вас есть несколько схем в вашей базе данных, будет хорошей идеей убедиться, что вы используете схему при их вызове.Например, если у вас есть схема с именем Accounts и proc с именем AccountGet, вам следует использовать exec accounts.AccountGet ..

Во-вторых, если ваша процедура использует ЛЮБОЙ динамический sql, то вызывающему пользователю потребуетсясоответствующие права на эти таблицы, а не только на процедуру.

Допустим, у вас есть процедура с именем AccountGet, которая выполняет exec, который делает выбор.У вашего пользователя должны быть права на выполнение AccountGet, а также право выбора в соответствующих таблицах.

То же самое относится и к любым вызовам, для которых требуется контекст безопасности.Контекст текущего выполняющегося пользователя передается.Если у этого пользователя нет прав, вы получите ошибки разрешения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...