segunda-feira, 17 de setembro de 2018

Como transferir logins para outro servidor SQL ou instância

Com qualquer migração de servidor, o ideal é que você queira que as coisas sejam executadas sem problemas e recriar os logins e senhas do SQL Server do zero não é algo que você realmente queira ou deveria estar fazendo.
Atualmente, estou envolvido em uma substituição completa de servidor para um dos nossos clusters do SQL Server. Nesse ambiente, a autenticação mista está ativada.
No passado, quando eu estava aprendendo sobre a transferência de bancos de dados de um servidor, descobri rapidamente que a restauração de um banco de dados de um servidor para outro não era tão simples quanto eu esperava. Eu me deparei com um obstáculo que eu precisava superar na forma do SID.
Então, primeiro vou falar sobre as maneiras pelas quais você pode transferir logins de um SQL Server para outro e explicar sobre o SID mais abaixo no post.
Formas de transferir logins e senhas SQL entre instâncias do SQL Server
Agora você pode fazer isso da maneira mais fácil ou mais difícil!
Você pode configurar manualmente cópias de seus logins em seu novo servidor com senhas (se as conhecer) ou automatizar essa tarefa com a ajuda de um script T-SQL ou SSIS.
Eu não sei sobre você, mas eu não gosto de manual e eu recomendo que você automatize isso a cada vez.

Usando o T-SQL para transferir logins e senhas entre instâncias do SQL Server

Você pode obter um script da Microsoft aqui . Você executa o script, ele cria um procedimento armazenado chamado sp_help_revlogin no seu SQL Server. Quando você executa o procedimento armazenado, ele gera instruções CREATE LOGIN para todos os logons de seu servidor, incluindo suas senhas e “sids”.
Você pode então pegar esse script, executá-lo no seu novo SQL Server para configurar os logins do servidor lá. Obviamente, tome cuidado para examiná-lo antes de executá-lo, para ter certeza de que ele capturou tudo e para garantir que você não esteja copiando nada que não seja necessário em sua nova instância.
O script configurará os logins em seu novo servidor usando o idioma padrão configurado para esse servidor, portanto, verifique se ele está configurado corretamente primeiro.

Usando a tarefa de transferência de logins no SSIS para copiar logins e senhas entre instâncias do SQL Server

Há uma tarefa de logons de transferência no SSIS que também fará o trabalho. Na imagem em anexo, estou usando a nova versão do SSIS que é fornecido com o SQL Server 2012. A tarefa logins de transferência cai sob a rubrica “outras tarefas” na caixa de ferramentas SSIS e está disponível em versões antigas do SSIS.

Então, você pode ver na captura de tela que a tarefa de logins de transferência é bastante autoexplicativa. O melhor do SSIS é que ele segura a sua mão de várias maneiras e torna as coisas o mais fáceis possíveis.
Você pode criar conexões a partir desta tarefa, inserir os detalhes de login para sua origem e destino, escolher quais logins copiar e configurar a tarefa para se comportar de maneiras diferentes quando o login existir.
Como você pode ver, circulei “CopySids”, então agora é um bom momento para escrever sobre eles em mais detalhes.

Então, o que é um SID?

SID é abreviação de “identificador de segurança” Um SID é um id interno que é atribuído a um login de servidor quando o login é criado.
O SID pode ser visualizado consultando a visualização do sistema sys.server_principals ou você também pode visualizá-lo observando sys.syslogins
1SELECT principal_id, sid, name
2FROM sys.server_principals
1SELECT sid, name
2FROM sys.syslogins
Cada login do servidor, seja um logon do SQL, login do Windows ou um que tenha sido criado usando um certificado ou uma chave assimétrica, é atribuído a um SID. Então vamos imaginar um cenário de exemplo onde um novo login é criado e por acaso é um login do SQL Server, esse login é chamado “server_login1”.
Em seguida, você cria um login do banco de dados dentro do banco de dados AdventureWorks2012 usando o login do servidor recém-criado. Vamos chamar isso de "db_login1".
Agora veja o SID em sys.server_principals e sys.database_principals em AdventureWorks2012 e o SID será do mesmo valor.
1SELECT sid
2FROM sys.server_principals
3WHERE name 'server_login1'
4
5USE AdventureWorks2012
6GO
7SELECT sid
8FROM sys.database_principals
9WHERE name 'db_login1'
A menos que você crie seus logins em seu novo servidor usando um método como o sp_help_revlogin ou a tarefa de logons de transferência do SSIS com “CopySids” habilitado, seus logins serão criados com novos SIDs.
Não tenho certeza se é possível que seu novo servidor atribua o mesmo SID, mas sei que é muito improvável. Talvez você tenha mais chances de ganhar o prêmio da loteria 🙂

Então, que problemas isso causa?

Como os SIDs são diferentes, quando você copia / restaura os bancos de dados do servidor antigo, os logins do banco de dados simplesmente não funcionarão, pois ficarão órfãos de seu SID original.
Você pode encontrar esse erro, por exemplo, se tentar adicionar um login de servidor a um banco de dados que acabou de ser copiado.
Erro 15023: o usuário já existe no banco de dados atual
Isso precisará ser corrigido.
Existe um procedimento que você pode executar para fazer isso e, basicamente, leva o login do servidor e o login do banco de dados e os associa ao nome com o mesmo SID.
Este procedimento é chamado de  sp_change_users_login  e eu vou falar sobre isso nos próximos posts.

Gustavo Damatto
MCSD - Microsoft Certified Solutions Developer

linkedin.com/in/damatto

Ribeirão Preto-SP


Nenhum comentário:

Postar um comentário