Eu sei que posso consultar permissões efetivas usando 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
...
Isso me diz se o usuário atual tem permissões SELECT, INSERT, UPDATE, etc. myTable
no banco de dados myDatabase
.
É possível descobrir facilmente por que o usuário tem essas permissões? Por exemplo, eu adoraria ter uma função fn_my_permissions_ex
que gerasse uma reason
coluna adicional:
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
...
Infelizmente, não consegui encontrar essa função na documentação do SQL Server. Existe uma ferramenta ou script que fornece essa funcionalidade?
Você pode encontrar algumas boas informações sobre segurança no artigo abaixo.
Revisando as permissões do SQL Server | TechRepublic http://tek.io/KfzEyp
Exceto: