Em uma instância do SQL Server 2014 com RAM e discos rápidos suficientes, existem mais de 160 usuários que têm acesso a um banco de dados. Por alguma razão, sem o meu conhecimento, a execução do comando DROP USER [username]
neste banco de dados leva até 5 segundos por usuário.
Remapear os usuários para logins e restaurar suas permissões é muito rápido.
No contexto da atualização de bancos de dados DEV da produção, eu tenho que eliminar e recriar todos os usuários do banco de dados. Portanto, é necessário descartar os usuários do banco de dados e recriá-los.
Como faço para acelerar o DROP USER
comando?
Lembre-se, eu tenho que executá-lo mais de 160 vezes para o exemplo sobre o qual estou escrevendo.
Este é o SQL que estou usando:
DECLARE drop_user_cur CURSOR FOR
SELECT name FROM #drop_users
OPEN drop_user_cur
FETCH NEXT FROM drop_user_cur INTO @user
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'use [' + @db_name + '] DROP USER [' + @user + ']'
BEGIN TRY
print @sql
EXECUTE(@sql)
END TRY
BEGIN CATCH
print 'ERREUR : ' + @sql
END CATCH
FETCH NEXT FROM drop_user_cur INTO @user
END
CLOSE drop_user_cur
DEALLOCATE drop_user_cur
O problema não está vindo do cursor; é o real DROP USER
que leva até 5 segundos.
Usando sp_whoisactive
, o wait_type é NULL
.
Não preste atenção à duração, ao DROP
e CREATE USER
estava sendo executado em um WHILE
loop, e é por isso que está dizendo mais de um minuto.
O Profiler mostra mais de 125.000 leituras para executar DROP USER
.
O Service Broker não está ativado.
fonte
Respostas:
A solução para esse problema foi ativar o service broker no banco de dados.
Após ativar o service broker para o banco de dados, os usuários descartados foram praticamente instantâneos.
Kin perguntou se o corretor de serviço estava habilitado em um comentário anterior, o que me fez procurar na direção certa.
fonte
isso não é uma resposta para a pergunta, mas um argumento para descartá-la completamente.
Se bem entendi seu comentário:
seu objetivo é copiar dados de produção em um sistema dev e fazê-los funcionar com a mesma permissão que a produção, usando os mesmos nomes de usuário .
O caminho mais rápido é clonar logons sql do sistema de produção no sistema dev usando o procedimento descrito por ms neste artigo kb .
com o procedimento definido por ms, o resultado é que você pode restaurar os bancos de dados no servidor de desenvolvimento e a permissão está funcionando sem alterações.
Usei com êxito o procedimento acima mencionado para copiar um ambiente de produção do sql 2005 para os ambientes test & dev sql 2012.
Após a clonagem dos usuários, uma simples restauração do banco de dados levou-me a um par de novos sistemas totalmente funcionais com dados atualizados.
A grande vantagem dessa solução é que, para atualizar os dados do desenvolvedor, basta restaurar o banco de dados de produção e pronto; você terá que ajustar referências, sinônimos e coisas do tipo, mas as permissões não serão quebradas.
Aqui está o código do artigo, apenas para referência, mas consulte o artigo que possui observações e detalhes sobre compatibilidade com versões sql antigas, detalhes de criptografia de senha e outras informações que podem lhe poupar dor de cabeça ao transferir os logins entre servidores:
fonte
Um cursor semelhante a este deve funcionar
fonte