Ao observar as propriedades de um determinado login, é possível ver uma lista de usuários mapeados para esse login:
Criei o perfil do SQL Server Management Studio (SSMS) e vejo que o SSMS se conecta a todos os bancos de dados um de cada vez e recupera informações de sys.database_permissions
É possível escrever uma única consulta que recupere as informações de mapeamento do usuário mostradas acima ou sou forçado a usar um cursor ou sp_MSforeachdb ou algo parecido?
Aqui está uma maneira usando SQL dinâmico. Não há realmente nenhuma maneira de fazer isso sem iterar, mas essa abordagem é muito mais segura do que opções não documentadas, sem suporte e com erros, como
sp_MSforeachdb
(background here and here ).Isso obterá uma lista de todos os bancos de dados online, o usuário mapeado (se existir), juntamente com o nome do esquema padrão e uma lista separada por vírgulas das funções às quais eles pertencem.
Em versões mais modernas (2017+), eu ainda usaria SQL dinâmico, mas usaria
STRING_AGG()
em vez deFOR XML PATH
, provavelmente algo assim:Neste último exemplo, se você quiser apenas os bancos de dados com um usuário mapeado para o logon nomeado, basta alterar a primeira junção esquerda para uma junção interna.
Este script é ligeiramente modificado a partir de um script mencionado em fará o que você está procurando. Substitua 'ThursdayClass' pelo login para o qual você precisa de informações. https://www.simple-talk.com/sql/sql-tools/the-sqlcmd-workbench/
Tente sp_dbpermissions . Provavelmente fornecerá mais informações do que você precisa, mas fará o que você deseja.
Uma vez instalado, execute isso.
Aviso justo no momento em que ele faz uma correspondência "like", portanto, se outros logins forem semelhantes e corresponderem, você os verá também. Por exemplo ,
MyLogin
eMyLoginForThis
ambos corresponderão emMyLogin
. Se isso for um problema, tenho uma versão que ainda não lancei onde você pode desativá-la. Me avise e eu posso enviar por e-mail para você.Infelizmente, você terá que percorrer todos os bancos de dados para obter as informações. Você desejará ingressar
sys.database_principals
emsys.server_principals
cada banco de dados correspondente no SID.Não use
sp_msforeachdb
, pois é conhecido por perder bancos de dados às vezes.Aqui está uma solução powershell:
Eu estava procurando uma resposta semelhante e encontrei isso: https://www.pythian.com/blog/httpconsultingblogs-emc-comjamiethomsonarchive20070209sql-server-2005_3a00_-view-all-permissions-_2800_2_2900_-aspx/ . E sim, ele usa o temido sp_MSforeachDB, mas acho que esse cara tem uma má reputação às vezes... ;-)
Vou postar o SQL aqui para facilitar o copy-pasta (não estou recebendo crédito por isso, apenas tornando-o facilmente acessível!):
A consulta abaixo deve retornar os mapeamentos para o DbName solicitado
A consulta aprimorada está abaixo
E sobre
EXEC master..sp_msloginmappings
?