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”.


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

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ł


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 :)


52

musisz uruchomić coś takiego

GRANT Execute ON [dbo].fnc_whatEver TO [domain\user]

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

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.



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

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.


1

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


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


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


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.