Я использую SQL-сервер 2008 и имею proc, который использует sp_executesql внутри. Я продолжаю получать следующую ошибку при выполнении proc через ASP.NET:
ИЗБРАННОЕ разрешение было отклонено на объектном 'MyTable', базе данных 'MyDatabase', схема 'dbo'.
Я провел большое исследование в области этого, и большинство людей указывает на то, что я должен дать избранное разрешение на базовой таблице, из которой читает мой динамический запрос. Ну, я сделал это, и это все еще, кажется, не работает:
select object_name(major_id) as object,
user_name(grantee_principal_id) as grantee,
user_name(grantor_principal_id) as grantor,
permission_name,
state_desc
from sys.database_permissions
where major_id = object_id('User') and
class = 1
Results: MyTable public dbo SELECT GRANT MyTable guest dbo SELECT GRANT MyTable myuser dbo SELECT GRANT MyTable NT AUTHORITY\NETWORK SERVICE dbo SELECT GRANT
Как Вы видите, я пошел излишество при попытке предоставить выбор на базовой таблице. Я даже переписал свой proc вниз так, чтобы это только ссылки MyTable в динамическом sql. Я даже допустил, что все вышеупомянутые пользователи "выполняют" разрешение на proc... Никакая удача.
"myuser" выше является именем пользователя в моем connectionstring в web.config.
Я пропускаю что-то здесь?
Спасибо! Dave
Я понял это. Размещаю это для всех, кто сталкивается с этим.
1) Во-первых, я заметил, что у моего пользователя dbo нет логина, связанного с ним. Вы можете увидеть это, щелкнув правой кнопкой мыши на пользователе dbo в папке Security/Users на пользователе dbo и нажав Properties. В выделенной серым цветом области Вы должны указать Имя пользователя (dbo) и Имя пользователя (sa). Я думаю, что это обычно происходит, когда вы восстанавливаете свою базу данных или что-то в этом роде (не уверен). В любом случае, если вы не видите имени пользователя, просто запустите скрипт в базе данных с проблемой:
sp_chchangebowner 'sa'
Это просто делает dbo владельцем базы данных (или что-то в этом роде). Причина, по которой я узнал об этом, заключается в том, что я попытался сохранить некоторые разрешения, такие как "db_datareader", "db_datawriter", через этот gui-интерфейс, но выкинул ошибку, говорящую о том, что требуется имя логина. Я думаю, что dbo должен был проверить db_datareader (мой проверяет), и я думаю, что это все равно превосходит все остальные.
2) Чтобы заставить мой proc работать, я должен был добавить в конце proc "с исполнением в качестве владельца". Я пробовал это раньше, но думаю, что это не сработало из-за моего первого номера #1. Прок обычно работает под владельцем прок, но не с динамическим sql внутри прок. Они запускаются в контексте пользователя, выполняющего т.н. proc. Для меня это странно, потому что я думаю, что мне нужно будет добавить это в dynamic sql (что я и пытался сделать), но это должно быть в самом proc (пойти figure?)
3) Наверное, не повредит запустить этот скрипт также:
предоставите select on 'MyTable' в 'MyUser'
для каждой таблицы, используемой в dynamic sql.
Надеюсь, это поможет...
вот несколько ссылок на этот же вопрос:
http://kbalertz.com/301299/Security-Context-Dynamic-Statements-Inside-Stored-Procedure.aspx