получение “избранного разрешения отклонило” ошибку при использовании sp_executesql в proc (SQL-сервер 2008)

Я использую 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

5
задан Paul Creasey 3 February 2010 в 23:59
поделиться

1 ответ

Я понял это. Размещаю это для всех, кто сталкивается с этим.

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://www.jimmcleod.net/blog/index.php/2007/05/15/sp_executesql-breaks-chain-of-ownership-in-sql-server-2000/

http://kbalertz.com/301299/Security-Context-Dynamic-Statements-Inside-Stored-Procedure.aspx

http://www.mssqltips.com/tipprint.asp?tip=1822

5
ответ дан 14 December 2019 в 19:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: