Odmowa uprawnienia EXECUTE do typów tabel zdefiniowanych przez użytkownika?

87

Mam pytanie dotyczące typów tabel zdefiniowanych przez użytkownika w programie SQL Server 2008.

Na potrzeby jednej z aplikacji ASP.NET zdefiniowaliśmy własne typy tabel na SQL Server 2008, aby używać ich jako parametrów w procedurach składowanych (wykonując polecenie sql w aplikacji ASP.NET przekazujemy obiekt DataTable jako parametr procedury składowanej zobacz tutaj przykład )

Problem polega na tym, że gdy uruchamiamy polecenie Sql (wykonaj procedurę składowaną) z ASP.NET, otrzymujemy błąd:

Odmowa uprawnienia EXECUTE do obiektu „ourTableType”, bazy danych „ourDatabase”, schematu „ourSchema”.

Dlaczego to jest takie? Dlaczego musimy ustawić uprawnienia do typów tabel zdefiniowanych przez użytkownika? Dlaczego nie wystarczy mieć uprawnienia ustawione tylko w procedurze składowanej, która go używa? A jeśli musimy ustawić go bez względu na to, dlaczego nie ma EXECUTEtypu uprawnienie do zestawu w oknie właściwości w ogóle (Widzę tylko Control, References, Take Ownership, View Definition)?

Nie rozumiem też, że ustawienie uprawnień Controlw oknie właściwości rozwiązuje problem, a procedura składowana działa bez problemów.

Janez
źródło
Dziękuję Ci! Szukałem, ale najwyraźniej nie wystarczająco dobrze: /
Janez
Spróbuj umieścić AS dbona końcu. Tak: GRANT EXEC ON TYPE::[schema].[typename] TO [User] AS dbo. Pracował dla mnie.
Jonathan

Odpowiedzi:

197

Naprawdę mam nadzieję, że już to rozwiązałeś, ponieważ pytanie ma prawie 4 miesiące, ale na wypadek, gdybyś tego nie zrobił, oto, co myślę, że jest odpowiedź.

GRANT EXEC ON TYPE::[schema].[typename] TO [User]
GO
mccow002
źródło
9
Moje 2 centy: W zależności od mechanizmu uwierzytelniania połączenia może być konieczne przyznanie exec na grupę publiczną. Twój grant będzie wyglądał tak: GRANT EXEC ON TYPE :: [schemat]. [Nazwa typu] TO [Public] GO
Sudhanshu Mishra
@dotnetguy bardzo dziękuję, żadne z rozwiązań nie zadziałało dla mnie poza twoim.
Mazen el Senih
3

Jeśli twoja procedura składowana używa dynamicznego sql, co oznacza, że @sqljest generowany, a następnie wykonywany za pośrednictwem exec @sql, będziesz potrzebować uprawnień udzielonych w bazowych tabelach.

Jednym obejściem jest zmodyfikowanie procedury składowanej, aby działała jako inny użytkownik . Jeśli sprawisz, że będzie działał jako SELF, zostanie uruchomiony pod twórcą przechowywanego procesu, co jest niezwykle niebezpieczne. Jeśli jednak nie masz innej opcji:

CREATE PROCEDURE dbo.usp_Demo
WITH EXECUTE AS SELF
rkw
źródło
1
Dzięki za wskazanie tego. Ale procedura składowana nie zawiera żadnego dynamicznego sql. Tylko ogólne INSERT INTOi „AKTUALIZUJ” instrukcje tabeli, do których ten użytkownik ma wszystkie potrzebne mu uprawnienia. Również ten użytkownik / login jest specjalnie zarezerwowany / utworzony dla tej aplikacji ASP.NET, aby móc łączyć się z tą bazą danych i wykonywać tylko procedury składowane (nie tworzyć itp., Twórca jest zawsze 'sa').
Janez
Dzięki, to był problem dla mnie. Inni czytelnicy z tym problemem mogą zapoznać się z sekcją Uprawnienia serwera SQL w procesach przechowywanych z dynamicznym kodem SQL, aby uzyskać więcej wskazówek.
Nickolay