Odmówiono uprawnienia EXECUTE do obiektu „xxxxxxx”, bazy danych „zzzzzzz”, schematu „dbo”

187

Mam problemy z wykonaniem funkcji.

Oto co zrobiłem:

  1. Utwórz funkcję za pomocą SQL Server Management Studio. Zostało pomyślnie utworzone.
  2. Następnie spróbowałem uruchomić nowo utworzoną funkcję i oto, co otrzymuję:

Odmówiono uprawnienia EXECUTE do obiektu „xxxxxxx”, bazy danych „zzzzzzz”, schematu „dbo”.

upendra parmar
źródło
Jeśli użytkownik pełni rolę db_owner, użytkownik może również wykonać (nie równa się przyznaniu exec ...)
hazjack,
Wystąpił ten błąd, gdy w mojej instrukcji SQL wystąpił błąd składniowy. Zasadniczo miałem połączone GOi Createdo GOCreate. Inne błędy składniowe również wydają się powodować ten błąd.
Ganesh Kamath - „Code Frenzy”

Odpowiedzi:

163

Wygląda na to, że musisz przyznać uprawnienia do wykonania użytkownikowi (lub grupie, której jest on częścią) dla danej procedury składowanej.

Na przykład, mógłby udzielić dostępu w ten sposób:

USE zzzzzzz;
GRANT EXEC ON dbo.xxxxxxx TO PUBLIC
Rowland Shaw
źródło
2
Cześć, wiem, że to było trochę czasu temu, ale mam pytanie. Czy takie działanie może mieć problemy z bezpieczeństwem? Czy to otwiera sp do użytku dla wszystkich?
Valentyn Vynogradskiy
9
Tak, pozwala każdemu, kto ma połączenie z bazą danych, na uruchomienie procedury składowanej. Spodziewałbym się, że ludzie obawiający się o bezpieczeństwo udzielą dostępu do odpowiedniej grupy w swojej bazie danych .
Rowland Shaw
7
Możesz także użyć GRANT EXEC TO PUBLIC aby przyznać dostęp do wszystkich obiektów w bazie danych
sohaiby,
2
Nigdy nie przyznałem uprawnień do wykonywania roli publicznej. Jakikolwiek sposób w naszym środowisku nakazano wyłączenie roli publicznej. Zawsze udzielam uprawnień do wykonywania określonemu użytkownikowi lub roli utworzonej specjalnie w tym celu.
user1161391,
4
dlaczego wszyscy entuzjastycznie komentują komentarze sugerujące przyznanie PUBLICZNEM uprawnień do wykonywania czegokolwiek w bazie danych? To szczególny przypadek, a nie defakt.
Sat Thiru
111

Najlepszym rozwiązaniem, jakie znalazłem, jest utworzenie nowej roli bazy danych, tj

CREATE ROLE db_executor;

a następnie udzielić tej roli uprawnienia exec.

GRANT EXECUTE TO db_executor;

Teraz, gdy przejdziesz do właściwości użytkownika i przejdziesz do mapowania użytkowników i wybierzesz bazę danych, do której dodałeś nową rolę, teraz nowa rola będzie widoczna w członkostwie roli bazy danych dla: sekcji

Aby uzyskać więcej informacji, przeczytaj cały artykuł

kazim
źródło
8
Ta odpowiedź jest najlepsza, jeśli musisz przyznać EXECUTE dla wszystkich SP dla konkretnego loginu użytkownika - bez korzystania z public lub db_owner. Wydaje się, że jest to najbardziej rozważna i użyteczna odpowiedź tutaj.
jcollum
1
Z jakiegoś powodu jest to jedyna odpowiedź, która działa dla mnie na SQL Server 2012. Udzielenie mojemu użytkownikowi wyraźnego uprawnienia WYKONAJ nie działa. Działa tylko wtedy, gdy dziedziczy uprawnienia poprzez rolę.
Keith
1
To powinna być odpowiedź. Dla mnie to działało jak urok. Wielkie dzięki!
Shahbaaz
Następnie dodaj go do konta, takiego jakEXEC sp_addrolemember @rolename = N'db_executor', @membername = N'processAPI'
ΩmegaMan
72

W Sql Server Management Studio:

po prostu idź do security->schema->dbo .

Kliknij dwukrotnie dbo, a następnie kliknij permission tab->(blue font)view database permissioni przewiń w poszukiwaniu wymaganych pól, takich jak "execute".Pomóż samemu wybrać użycie grantlub denysterowanie. Mam nadzieję, że to pomoże :)

Suhail Mumtaz Awan
źródło
52

musisz uruchomić coś takiego

GRANT Execute ON [dbo].fnc_whatEver TO [domain\user]
Iain
źródło
4
To było to, co potrzebne, ale musiałem to zrobić [domain\user], a nie'domain\user'
Paul Stephenson
45

Działa to, jeśli próbujesz udzielić uprawnień użytkownikom lub rolom.

Za pomocą Microsoft SQL Server Management Studio:

  1. Idź do: Bazy danych
  2. Kliknij prawym przyciskiem myszy dbo.my_database
  3. Wybierz: Właściwości
  4. Na lewym panelu bocznym kliknij: Uprawnienia
  5. Wybierz użytkownika lub rolę w panelu nazw
  6. Znajdź opcję Wykonaj w uprawnieniach i znacznik wyboru: Udziel, Udziel lub Odmów
csebryam
źródło
Niestety użytkownik ma już uprawnienia do wykonywania! Dlatego to takie mylące ...
Douglas Gaskell,
Dzięki Keim to działa idealnie, kiedy zaznaczam Grant
Rosh
16

Udzielenie takiego pozwolenia może być niebezpieczne, szczególnie jeśli twoja aplikacja internetowa używa tej samej nazwy użytkownika.

Teraz użytkownik sieci (i cała sieć) ma również uprawnienia do tworzenia i upuszczania obiektów w bazie danych. Pomyśl o iniekcji SQL!

Zalecam przyznanie uprawnień do wykonywania tylko określonemu użytkownikowi na danym obiekcie w następujący sposób:

grant execute on storedProcedureNameNoquotes to myusernameNoquotes

Teraz użytkownik myusernameNoquotes może wykonać procedurę przechowywanąProcedureNameNoquotes bez innych niepotrzebnych uprawnień do cennych danych.

AMAR PANRAY
źródło
3

Jeśli masz problemy, takie jak pytanie zadane powyżej, dotyczące wyjątku zgłoszonego podczas wykonywania rozwiązania, problemem jest pozwolenie, które nie zostało poprawnie przyznane użytkownikom tej grupy na dostęp do bazy danych / procedury składowanej. Wszystko, co musisz zrobić, to zrobić coś takiego, co mam poniżej, zastępując mój nazwą bazy danych, procedur przechowywanych (funkcji) i typem uprawnień lub roli lub komu udzielasz dostępu.

USE [StableEmployee]
GO
GRANT EXEC ON dbo.GetAllEmployees TO PUBLIC

/ ****** Obiekt: StoredProcedure [dbo]. [GetAllEmployees] Data skryptu: 01/27/2016 16:27:27 ****** /

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[GetAllEmployees]
as
Begin
Select EmployeeId, Name, Gender, City, DepartmentId
From tblEmployee

End
Okwo Mojżesz
źródło
2

Możesz dać wszystkim uprawnienia do wykonywania:

GRANT Execute on [dbo].your_object to [public]

„Publiczna” to domyślna rola bazy danych, której wszyscy użytkownicy są członkami.

philu
źródło
1

Napotkałem ten sam problem i rozwiązałem problem, dając użytkownikowi bazy danych uprawnienia db_owner.

Singaravelan
źródło
11
nie sądzę, że to dobre rozwiązanie ... ponieważ nie mogę dać mojej aplikacji sieciowej tego pozwolenia .. nie wiem, kto to głosuje
Mina Gabriel
7
Niezalecane, ponieważ jest to bardzo niepewne. Powinieneś utworzyć odpowiednie role zamiast używać db_owner, który ma pełną kontrolę nad całą bazą danych
Yetiish
1

Jeśli uczynisz tego użytkownika specjalnym dla konkretnej bazy danych, być może nie ustawisz go jako db_owner w „mapowaniu użytkowników” właściwości

Fatemeh M. Rezaie
źródło
1

lepiej zmodyfikuj role serwera, które zostały zaprojektowane z myślą o uprawnieniach bezpieczeństwa. dodaj rolę serwera sysadmin do swojego użytkownika. dla większego bezpieczeństwa możesz mieć swoje niestandardowe role serwera. ale to podejście da ci teraz to, czego chcesz.

  1. Object Explorer -> Serwer -> Bezpieczeństwo -> Loginy
  2. Kliknij prawym przyciskiem myszy żądanego użytkownika
  3. Przejdź do ról serwera po lewej stronie
  4. Upewnij się, że sysadmin jest zaznaczony
  5. Naciśnij OK i uruchom ponownie serwer SQL

Powodzenia

wprowadź opis zdjęcia tutaj

Ali Kashanchi
źródło
1
sysadmin jest całkowitą nadwyżką (i niebezpieczną)
Trubs
0

oto jak udzielić pozwolenia jednemu użytkownikowi niepublicznemu,

Bezpośrednie zapytanie:

Use MyDatabase Grant execute on [dbo].[My-procedures-name] to [IIS APPPOOL\my-iis-pool] Go

Mando Basha
źródło