Tenho enfrentado um problema nas versões 14, 18 e 19 do SSMS, em que o carregamento do mapeamento de usuário de qualquer login demora muito para carregar, às vezes até uma hora, ou simplesmente nunca carrega e não responde.
Alguém já passou por isso antes e/ou pode dar alguma orientação sobre como resolver isso?
Eu tentei o seguinte:
- Confirmado que não importa se é um login AD ou login SQL
- Atualizando a versão do SQL Server de 2016 para 2022
- Atualizando a versão do SSMS de 14 para 18 e para 19
- Verificado se há algum bloco SQL (não há nenhum)
- Tentei vários logins diferentes (todos parecem passar por isso)
Existem 25 bancos de dados nesta instância SQL e aproximadamente 50 logins no total.
Infelizmente, esse problema está tornando incrivelmente difícil gerenciar a segurança do usuário e os mapeamentos para bancos de dados sem escrever alguma consulta SQL.
Qualquer apoio ou orientação seria muito apreciado!
Saúde,
EDIT - executei um rastreamento SQL e identifiquei a seguinte consulta como o infrator:
USE [database_name]
SELECT
u.name AS [Name],
CAST(CASE dp.state WHEN N'G' THEN 1 WHEN 'W' THEN 1 ELSE 0 END AS bit) AS [HasDBAccess],
ISNULL(u.default_schema_name,N'') AS [DefaultSchema]
FROM
sys.database_principals AS u
LEFT OUTER JOIN sys.database_permissions AS dp ON dp.grantee_principal_id = u.principal_id
and dp.type = @_msparam_0
WHERE
(u.type in ('U', 'S', 'G', 'C', 'K' ,'E', 'X'))
and
(ISNULL(suser_sname(u.sid),N'')=@_msparam_1)
Ele é executado após a seleção de um banco de dados para execução e é a quarta consulta a ser executada.
EDIT 2 - É especificamente esta parte que está causando o problema e não tenho ideia do porquê:
and
(ISNULL(suser_sname(u.sid),N'''')=@_msparam_1)
EDIT 3 - Tenho certeza de que é a função "suser_sname", tendo-a testado em diferentes bancos de dados e logins diferentes. Ele simplesmente trava e nunca é concluído, forçando-me a fechar o SQL.
Qualquer orientação adicional seria apreciada, obrigado.
EDIT 4 - Contexto adicional, desculpas pela omissão original desta informação.
Esse problema está ocorrendo em um domínio separado , nosso ambiente DEV. É onde nossos bancos de dados de produção são restaurados e, como parte dessa restauração, os logins SQL associados são atualizados para funcionar no domínio DEV quando necessário.
Gostaria de saber se talvez alguns logins SQL órfãos estivessem causando esse problema com alguma incompatibilidade do SID em sys.database_principals. Sim, houve alguns logins órfãos, mas após corrigi-los com sp_change_users_login, esse problema ainda ocorre.
DR - Certifique-se de ter uma limpeza robusta de usuário/login ao restaurar um banco de dados de um domínio do Windows para outro!!
Resposta completa: Conforme mencionado na minha pergunta, o problema reside em nosso ambiente DEV, onde os bancos de dados são restaurados de nosso ambiente PROD.
Ao fazer isso, executamos um script de atualização que atualiza usuários e logins em seu ambiente Windows específico. Por exemplo, PROD\L.Moy torna-se DEV\L.Moy, ao atualizar do domínio Prod para o domínio Dev.
O que este script de atualização NÃO faz é levar em consideração e remover usuários e logins não obrigatórios. Um usuário e login não obrigatórios ainda continham seu domínio PROD como parte do nome de usuário do Windows. Por exemplo, em nosso DEV SQL Server, você ainda pode encontrar o usuário PROD\foobar como um usuário no banco de dados, apesar de não ser necessário.
O que isso significou para mim foi que eu tinha cerca de 40 usuários PROD Windows SQL combinados contra 25 bancos de dados que NÃO eram necessários para nosso ambiente DEV.
Portanto, tendo em mente o que foi dito acima, quando você clica em "Mapeamento de Usuário" em um Login, ele executa uma função do sistema chamada "SUSER_SNAME". Quando executei essa função especificamente em SIDs para usuários PROD e logins em nosso ambiente DEV, demorou pouco mais de um minuto para cada um. Se você executar "SUSER_SNAME" com um SID para um login que deveria estar em DEV, ele será concluído imediatamente.
Portanto, a solução aqui foi limpar todos os logins e usuários que não eram realmente necessários, de todos os bancos de dados no ambiente DEV.
Então, ao selecionar "Mapeamento de usuários" em um login, ele é concluído imediatamente, sem nenhum problema de desempenho.
Obrigado a @Stephen Morris - Mo64 por suas orientações e sugestões.