получение ошибки «выберите разрешение запрещено» при использовании sp_executesql в proc (Sql Server 2008) - PullRequest
5 голосов
/ 04 февраля 2010

Я использую Sql Server 2008 и у меня есть процесс, который использует sp_executesql внутри. Я продолжаю получать следующую ошибку при выполнении процедуры через ASP.NET:

Отказано в разрешении SELECT для объекта «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

Как вы можете видеть, я переборщил с попыткой предоставить select для базовой таблицы. Я даже переписал свой proc так, чтобы он ссылался только на MyTable в динамическом sql. Я даже предоставил всем вышеупомянутым пользователям разрешение «выполнить» в процедуре ... Не повезло.

"myuser" выше - это имя пользователя в моей строке подключения в web.config.

Я что-то здесь упускаю?

Спасибо! Dave

Ответы [ 2 ]

5 голосов
/ 04 февраля 2010

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

1) Во-первых, я заметил, что у моего пользователя dbo нет имени для входа в систему. Это можно увидеть, щелкнув правой кнопкой мыши пользователя dbo в папке Security / Users пользователя dbo и выбрав Свойства. В серой области вы должны указать имя пользователя (dbo) и имя входа (sa). Я думаю, что это обычно происходит, когда вы восстанавливаете свою базу данных или что-то (не уверен). В любом случае, если вы не видите логин, просто запустите скрипт в базе данных с проблемой:

sp_changedbowner 'sa'

Это делает dbo владельцем базы данных (или что-то в этом роде). Причина, по которой я это выяснил, заключалась в том, что я пытался сохранить некоторые разрешения, такие как «db_datareader», «db_datawriter», через этот графический интерфейс, но выдает ошибку, в которой говорится, что имя пользователя требуется. Я думаю, что dbo должен был проверить db_owner (мой делает), и я думаю, что в любом случае это превосходит все остальные.

2) Чтобы заставить мой процесс работать, мне нужно было добавить «с исполнителем как владельцем» в конце процесса. Я пробовал это раньше, но думаю, что это не сработало из-за моей первой проблемы # 1. Procs обычно запускается под владельцем proc, но не динамический sql внутри procs. Они запускаются в контексте пользователя, выполняющего процедуру. Для меня это странно, потому что я подумал бы, что мне нужно добавить это в динамический sql (который я пробовал), но это должно быть в самом proc (пойди разберись?)

3) Вероятно, не мешало бы запустить и этот скрипт:

Предоставить выбор в «MyTable» для «MyUser»

для каждой таблицы, используемой в динамическом 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

0 голосов
/ 29 октября 2011

Что мне помогло:

В SQL Management Studio щелкните правой кнопкой мыши хранимую процедуру и выберите «Свойства», а на странице «Разрешения» предоставьте разрешение соответствующему пользователю. Соответствующий пользователь зависит от вашей строки подключения SQL: если вы используете проверку подлинности Windows, то это пользователь Windows (который может быть ASPNET, если так настроен); в противном случае это пользователь SQL, который вы указали в строке подключения. Разрешение, которое вам нужно предоставить, - это разрешение на выполнение.

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