Jak dowiedzieć się * dlaczego * użytkownik ma pewne skuteczne uprawnienia?

14

Wiem, że mogę sprawdzać efektywne uprawnienia, używając sys.fn_my_permissions:

USE myDatabase;
SELECT * FROM fn_my_permissions('dbo.myTable', 'OBJECT') 

 entity_name | subentity_name | permission_name 
------------------------------------------------
 dbo.myTable |                | SELECT          
 dbo.myTable |                | UPDATE          
 ...

To mówi mi, czy bieżący użytkownik ma uprawnienia SELECT, INSERT, UPDATE itp. myTableW bazie danych myDatabase.

Czy można łatwo dowiedzieć się, dlaczego użytkownik ma te uprawnienia? Na przykład chciałbym mieć funkcję, fn_my_permissions_exktóra wyświetla dodatkową reasonkolumnę:

USE myDatabase;
SELECT * FROM fn_my_permissions_ex('dbo.myTable', 'OBJECT') 

 entity_name | subentity_name | permission_name | reason
------------------------------------------------------------------------------------------------------------------------------------
 dbo.myTable |                | SELECT          | granted to database role public
 dbo.myTable |                | UPDATE          | member of group MYDOMAIN\Superusers, which belongs to database role db_datawriter
 ...

Niestety nie mogłem znaleźć takiej funkcji w dokumentacji SQL Server. Czy istnieje narzędzie lub skrypt zapewniający tę funkcjonalność?

Heinzi
źródło
dlaczego nie eksportujesz go do pliku txt ?, jakiego systemu operacyjnego używasz?
jcho360
1
@ jcho360: Nie ma żadnej funkcji fn_my_permission_ex, więc nie mogę nic wyeksportować. Pytam, czy istnieje funkcja lub narzędzie z tą funkcjonalnością .
Heinzi
używasz SSMS?
jcho360
1
Niesamowite pytanie. Próbowałem to rozgryźć bardzo długo. fn_my_permissions trochę działa, ale często pokazuje uprawnienia, których nie mogę wyśledzić do źródła.
PseudoToad

Odpowiedzi:

8

Kilka dobrych informacji dotyczących bezpieczeństwa można znaleźć w poniższym artykule.

Przegląd uprawnień do serwera SQL | TechRepublic http://tek.io/KfzEyp

Z wyjątkiem:

Poniższe zapytanie wykorzystuje widok systemu sys.database_permissions, aby wskazać, którzy użytkownicy mają określone uprawnienia w bieżącej bazie danych.

SELECT
        dp.class_desc
       ,dp.permission_name
       ,dp.state_desc
       ,ObjectName = OBJECT_NAME(major_id)
       ,GranteeName = grantee.name
       ,GrantorName = grantor.name
    FROM
        sys.database_permissions dp
        JOIN sys.database_principals grantee
        ON dp.grantee_principal_id = grantee.principal_id
        JOIN sys.database_principals grantor
        ON dp.grantor_principal_id = grantor.principal_id
jgardner04
źródło