Z dokumentacji technet ( http://msdn.microsoft.com/en-us/library/ms176097%28v=sql.105%29.aspx )
Returns a list of the permissions effectively granted to the principal on a securable. |
Przy pomocy tego polecenia możemy w szybki sposób sprawdzić nasze uprawnia względem konkretnego obiektu. Obiektem może być serwer, baza i oczywiście wszystkie inne, do których dostęp zarządzany jest przez uprawnienia sql server.
Funkcja przyjmuje dwa argumenty, pierwszy dotyczy ewentualnej nazwy obiektu, druga wyznacza jej poziom.
Przykład 1:
Chcemy sprawdzić uprawnienia w kontekście serwera. Bez względu na bazę, do której jesteśmy aktualnie zapięci możemy wykonać:
SELECT * FROM fn_my_permissions(NULL, 'SERVER');
Oczywiście ogrom uprawnień wynika z posiadanej przeze mnie roli sysadmin.
Przykład 2:
Sprawdzamy uprawnienia na konkretnej bazie i jako ktoś inny. W tym celu loguję się jako użytkownik testowy (’test’), który ma jedynie uprawnienia public na bazie AdventureWorks2012, przechodzimy najpierw do niej a następnie wykonujemy zapytanie:
USE AdventureWorks2012 GO SELECT DB_NAME(), * FROM fn_my_permissions(NULL, 'DATABASE');
Przykład 3:
Chcemy uzyskać informację jaki dokładnie mamy dostęp do wszystkich obiektów w danej bazie. Ponieważ dostęp do obiektu może być zdefiniowany już na poziomie kolumny, w wynikach otrzymamy dokładny opis dostępu do każdej kolumny, na której mamy jakieś uprawnienia. Dodajemy zatem użytkownikowi test uprawnienia do jednej tabeli (całej) oraz do pojedynczej kolumny w innej:
use [AdventureWorks2012] GO GRANT SELECT ON [HumanResources].[Employee] TO [test] GO use [AdventureWorks2012] GO GRANT SELECT ON [Person].[Password] ([ModifiedDate]) TO [test] GO
Sprawdzamy jakie uprawnienia dostanie użytkownik 'test’ gdy uruchomi poniższe zapytanie:
SELECT s.name , t.name , c.subentity_name , c.permission_name FROM sys.objects t JOIN sys.schemas s ON t.schema_id = s.schema_id CROSS APPLY fn_my_permissions(QUOTENAME(s.name) + '.' + QUOTENAME(t.name), 'OBJECT') c ORDER BY s.name , t.name , c.subentity_name
Widzimy, że wraz z uprawnieniem select do tabeli HumanResources.Employee użytkownik dostał uprawnienia zarówno do wszystkich kolumn tej tabeli jak i do innych obiektów z nią związanych. W przypadku tabeli Person.Password dostęp został nadany tylko do pola ModifiedDate.
Wszystkie te informacje pozwala zwrócić jedynie fn_my_permissions(), bez konieczności poszukiwania uprawnień po innych obiektach systemowych.