2010-07-27 6 views
1

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

Msg 15151, Level 16, State 1, Procedure XX, Line 15
Cannot find the object 'XX', because it does not exist or you do not have permission.

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

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

+0

Является ли схема той же, что и рабочая? –

+0

Извините ... уточнить. Когда вы входите в систему с одним из «проблемных логинов», вы можете выполнить SP, и вы вернете некоторые результаты, но вы также получите ошибку? Если это так, то мой следующий вопрос заключается в том, что ваш основной SP вызывает любые другие пользовательские функции SP/внутри? И если да, убедитесь, что ваши пользователи/роли имеют доступ к этой функции SP /. – Zippit

+1

Использует ли какая-либо из «проблемных» процедур динамический SQL ('exec ('')' или 'sp_executesql')?Если это так, разрешения должны быть предоставлены роли на целевом объекте (объектах). –

ответ

1

Пара вещей, чтобы проверить.

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

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

Предположим, у вас есть процедура с именем AccountGet, которая выполняет exec, который выполняет выбор. Ваш пользователь должен будет иметь права на выполнение AccountGet, а также право выбора на рассматриваемой таблице (таблицах).

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

1

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

0

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

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

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

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

Смежные вопросы