Jak przyznać uprawnienia do wykonania dla pojedynczej procedury składowanej?

40

Zwykle, gdy tworzę procedurę przechowywaną, używam następujących jako szablonu sortowania

Create procedure <procedurename>
<@param1 <type>, @param2 <type>, etc..> 
as begin

 <procedure>

end

Czy istnieje sposób, aby uwzględnić udzielanie uprawnień do wykonywania tylko tej procedury przechowywanej, gdy ja jestem na niej?
Na przykład jak ...

Grant execute [User_Execute] 

... ale tylko w przypadku tej procedury składowanej?

Widziałem inne podobne pytania, ale wszystkie odnoszą się do WSZYSTKICH procedur przechowywanych, a nie tylko jednego, ani nie widziałem takiego, w którym można określić uprawnienia w create procedureskrypcie. Mile widziane są nawet odpowiedzi na temat tego, w jaki sposób mogę ustawić uprawnienia bez GUI dla określonych procedur przechowywanych.

Edytuj Najlepsza odpowiedź z pewnością skierowała mnie we właściwym kierunku, to jest to, czego właściwie szukałem, nie myślałem o grupowaniu komend, co właśnie skończyłem, grupowaniu komend wraz z moją procedurą składowaną. W każdym razie myślę, że to całkiem sprytne.

Create procedure <procedurename>
<@param1 <type>, @param2 <type>, etc..> 
as begin

<procedure>

end
GO
GRANT EXECUTE ON <procedurename> to <username>
GO
DaneEdw
źródło
Kod podany w edytowanym tekście jest prawidłowy i poprawna odpowiedź na to pytanie.
ninty9notout

Odpowiedzi:

64
GRANT EXECUTE ON dbo.procname TO username;
Levi W
źródło
10

obciąć tabelę Ustawienie uprawnień do obiektów takich jak procedury składowane można wykonać za pomocą:

GRANT EXECUTE ON <schema>.<object> to <user>;

Możesz jednak także przyznać uprawnienia bezpieczeństwa zarówno na poziomie logowania, jak i na poziomie użytkownika. Będziesz chciał określić i przyznać TYLKO niezbędne prawa do obiektów wymagających dostępu (takich jak wykonanie). Rozważ skorzystanie z EXECUTE ASmożliwości, która umożliwia podszywanie się pod innego użytkownika w celu sprawdzenia uprawnień wymaganych do wykonania kodu BEZ konieczności przyznawania wszystkich niezbędnych uprawnień wszystkim bazowym obiektom (np. Tabelom). EXECUTE ASmożna dodawać do procedur przechowywanych, funkcji, wyzwalaczy itp.

Dodaj do kodu w następujący sposób bezpośrednio w Procedurze składowanej:

CREATE PROCEDURE dbo.MyProcedure WITH EXECUTE AS OWNER

W tym przypadku podszywasz się pod właściciela wywoływanego modułu. Możesz także podszyć się pod SELF, LUB użytkownika tworzącego lub zmieniającego moduł LUB ... imperonować CALLER, co pozwoli modułowi na przejęcie uprawnień bieżącego użytkownika, LUB ... podszywać się pod WŁAŚCICIELA, który przejmie pozwolenie właściciel procedury nazywa się OR ... personifikuje „nazwa_użytkownika”, który podszywa się pod konkretnego użytkownika LUB ... personifikuje „login_name” za pomocą personifikuje określonego loginu.

W większości przypadków wystarczy przyznać EXECUTEuprawnienia do przechowywanych procesów, a następnie prawa są przyznawane wszystkim obiektom, do których istnieją odniesienia w przechowywanym procesie.

W ten sposób NIE musisz udzielać uprawnień domyślnych (na przykład: aktualizować dane lub wywoływać dodatkowe procy). Łańcuch własności obsługuje to za Ciebie. Jest to szczególnie przydatne w przypadku dynamicznego SQL-a lub jeśli chcesz utworzyć zadania o podwyższonym poziomie bezpieczeństwa, takie jak CREATE TABLE. EXECUTE ASjest przydatnym narzędziem do rozważenia.

Ten przykład może pomóc wyjaśnić to wszystko:

Utwórz użytkownika o nazwie NoPrivUser z publicznym dostępem do bazy danych (np. Dbadb):

USE [master];
GO 
CREATE LOGIN [NoPrivUser] WITH PASSWORD=N'ABC5%', DEFAULT_DATABASE=[dbadb], 
  CHECK_EXPIRATION=ON, CHECK_POLICY=ON;
GO 
USE [DBAdb];
GO 
CREATE USER [NoPrivUser] FOR LOGIN [NoPrivUser];
GO

UWAGA: TWÓRCA LUB WŁAŚCICIEL NINIEJSZEJ PROCEDURY BĘDZIE WYMAGAĆ TWORZENIA PRAW TABELI w docelowej bazie danych.

use DBAdb 
go 
CREATE PROCEDURE dbo.MyProcedure 
WITH EXECUTE AS OWNER 

truncate table MyTable

GO
GRANT EXEC ON dbo.MyProcedure TO NoPrivUser; 
GO
-- Now log into your database server as NoPrivUser and run the following.

Dzięki EXECUTE ASklauzuli procedura przechowywana jest uruchamiana w kontekście właściciela obiektu. Ten kod został pomyślnie utworzony, dbo.MyTablea wiersze zostały pomyślnie wstawione. W tym przykładzie użytkownik NoPrivUsernie ma absolutnie żadnych przyznanych uprawnień do modyfikowania tabeli lub odczytu lub modyfikacji dowolnych danych w tej tabeli.

Przyjmuje tylko prawa potrzebne do wykonania tego konkretnego zadania zakodowanego W RAMACH tej procedury.

Ta metoda tworzenia procedur składowanych, które mogą wykonywać zadania wymagające podwyższonych uprawnień bezpieczeństwa bez trwałego przypisywania tych praw, jest bardzo przydatna.

Richard Ouimet
źródło
4
To jest ta sama odpowiedź, którą opublikowałeś wczoraj w SO , którą również musiałem sformatować pod kątem czytelności.
Aaron Bertrand
5

wprowadź opis zdjęcia tutaj

wybierz login bazy danych -> Idź do Securable i kliknij przycisk Wyszukaj jak na poprzednim obrazku. Po kliknięciu przycisku Wyszukaj zobaczysz następujące okno, aby dodać typ obiektu.

Kliknij przycisk Typy obiektów, a otrzymasz okno „Wybierz typy obiektów” z różnymi obiektami. Teraz, jeśli widzisz, procedura przechowywana jest wymieniona w obszarze typów obiektów. Teraz wybierzemy naszą konkretną procedurę składowaną, na którą chcemy udzielić zgody.

arnav
źródło
Po pierwsze, pytanie miało ponad pięć lat, kiedy odpowiedziałeś na nie. To by było w porządku, z wyjątkiem tego, że OP specjalnie poprosił o rozwiązania, które nie używają GUI i mogą być osadzone w skrypcie. Twoja odpowiedź nie rozwiązuje tego problemu.
Eric Brandt