Eu tenho uma função nomeada db_executor
e preciso descobrir quais permissões ela possui em quais objetos. Encontrei Listar todas as permissões para uma determinada função? mas a única solução que funciona remotamente é:
SELECT DB_NAME() AS 'DBName'
,p.[name] AS 'PrincipalName'
,p.[type_desc] AS 'PrincipalType'
,p2.[name] AS 'GrantedBy'
,dbp.[permission_name]
,dbp.[state_desc]
,so.[Name] AS 'ObjectName'
,so.[type_desc] AS 'ObjectType'
FROM [sys].[database_permissions] dbp LEFT JOIN [sys].[objects] so
ON dbp.[major_id] = so.[object_id] LEFT JOIN [sys].[database_principals] p
ON dbp.[grantee_principal_id] = p.[principal_id] LEFT JOIN [sys].[database_principals] p2
ON dbp.[grantor_principal_id] = p2.[principal_id]
WHERE p.[name] = 'db_executor'
O problema é que o ObjectName
e ObjectType
é NULL
. Portanto, embora eu saiba que ele só tem EXECUTE
permissão em um estado de GRANT
não sei a que objeto (s) isso se aplica. Existe uma maneira melhor de obter essa lista ou como posso modificar esse código para listar o (s) objeto (s)?
O script não possui uma junção à esquerda
sys.types
para obter informações do tipo de tabela, que também requer permissões de execução para uso (alternativamente, joinsys.table_types
, você obterá os mesmos dados). Tente o seguinte:O código abaixo fornece todas as funções
Encontrei apenas ObjectName, ObjectType apenas para função pública
E os seguintes valores