2010-02-03 10 views
5

Używam Sql Server 2008 i mam proc, który używa sp_executesql wewnątrz. Otrzymuję następujący błąd podczas wykonywania procesu przez ASP.NET:błąd "wybierz odmówiono zgody" podczas używania sp_executesql w proc (Sql Server 2008)

Odmówiono uprawnienia SELECT dla obiektu "MyTable", bazy danych "MyDatabase", schematu "dbo".

Zrobiłem wiele badań na ten temat i większość ludzi wskazuje na to, że muszę przyznać uprawnienie do wybierania w tabeli podstawowej, z której odczytuje moje dynamiczne zapytanie. Cóż, zrobiłem to i to wciąż nie wydają się działać:

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 

Jak widać, mam już przesada próbować udzielić select na tabeli podstawowej. Odtworzono nawet mój proc, tak że odwołuje się on tylko do MyTable w dynamicznym sql. Wydałem nawet pozwolenie dla wszystkich użytkowników "wykonaj" na proc ... Brak szczęścia.

Powyższy "myuser" jest nazwą użytkownika w moim łańcuchu połączeń w pliku web.config.

Czy tu czegoś brakuje?

Dzięki! Dave

+1

Czy procedura składowana ma zdefiniowane wyrażenie 'WITH EXECUTE AS'? – Aaronaught

+0

Tak ... wypróbowałem to z "MyUser", dzwoniąc, ja, właściciel. Czy są jeszcze inne, których mi brakuje? Zabawne jest to, że kiedy używam MyUser, to ten sam błąd pojawia się w oknie zapytań w studio zarządzania (bez tego nie) – Dave

Odpowiedz

4

Wymyśliłem to. Zamieszczam to dla każdego, kto się na to zdecyduje.

1) Po pierwsze, zauważyłem, że mój użytkownik dbo nie ma skojarzonej z nim nazwy użytkownika. Możesz to zobaczyć, klikając prawym przyciskiem myszy użytkownika dbo w folderze Zabezpieczenia/Użytkownicy na dbo i klikając Właściwości. W szarym polu powinieneś podać nazwę użytkownika (dbo) i nazwę użytkownika (sa). Myślę, że dzieje się tak zazwyczaj podczas przywracania bazy danych lub czegoś (nie jestem pewien). W każdym razie, jeśli nie widzisz nazwy logowania, wystarczy uruchomić skrypt w bazie o numerze:

sp_changedbowner „sa”

To właśnie sprawia, że ​​dbo właściciela bazy danych (czy coś takiego). Powodem, dla którego to znalazłem, było to, że próbowałem zapisać niektóre uprawnienia, takie jak "db_datareader", "db_datawriter" przez ten interfejs GUI, ale wystąpił błąd informujący, że nazwa logowania jest wymagana. Myślę, że dbo powinno mieć sprawdzoną db_owner (moja robi) i myślę, że to i tak przydaje się wszystkim innym.

2) Aby mój proces mógł działać, musiałem dodać "z egzekucją jako właściciel" na końcu procesu. Próbowałem już wcześniej, ale myślę, że to nie zadziałało z powodu mojego pierwszego numeru # 1. Procesy zazwyczaj działają pod kontrolą właściciela procesu, ale nie zawierają dynamicznego sql wewnątrz proc. Działają one w kontekście użytkownika wykonującego proces. Dla mnie jest to dziwne, ponieważ myślę, że musiałbym dodać to w dynamicznym sql (co próbowałem), ale musi to być w samym procesie (idź do figury?)

3) Prawdopodobnie nie zaszkodzi aby uruchomić ten skrypt też:

dotacji wybrać na „MyTable” do „myuser”

na każdym stole stosowanego w dynamicznym SQL.

Mam nadzieję, że to pomoże ...

oto niektóre odniesienia do tej samej kwestii:

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

+1

Należy oznaczyć odpowiedź jako poprawną. –

0

Co pomogło mi było:

W SQL Management Studio, kliknij prawym przyciskiem myszy procedura składowana i wybierz Właściwości, a na stronie Uprawnienia dot za misssion do odpowiedniego użytkownika. Odpowiedni użytkownik zależy od ciągu połączenia SQL: jeśli używasz uwierzytelniania systemu Windows, to jest to użytkownik systemu Windows (który może być ASPNET, jeśli jest tak skonfigurowany); w przeciwnym razie jest to użytkownik SQL, który podałeś w swoim łańcuchu połączenia. Uprawnienie, które musisz przyznać, to uprawnienie do wykonywania.

Powiązane problemy