fn_my_permissions() – Sprawdzenie jakie mamy uprawnienia do bazy danych

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.

POST PIERWOTNIE OPUBLIKOWANY JAKO TSQL NA DZIŚ #19

Dodaj komentarz