Antecedentes
Certa vez, para reproduzir um bug, precisei de um backup do banco de produção.
Para minha surpresa, encontrei as seguintes limitações:
- O backup do banco foi feito na versão SQL Server 2016 e não era compatível com minha SQL Server 2014.
- No meu computador de trabalho, o sistema operacional utilizado era Windows 7, portanto, não consegui atualizar SQL Server para a versão 2016
- O produto suportado fazia parte de um sistema maior com uma arquitetura legada fortemente interligada e também se referia a outros produtos e bancos, portanto, sua implementação em outra estação poderia levar muito tempo.
Tendo em vista o exposto, cheguei à conclusão de que era hora de soluções alternativas.
Recuperação de dados do backup
Decidi usar uma máquina virtual com Windows 10 (pode-se obter uma imagem de teste para o navegador Edge ). Na máquina virtual, foi instalado o SQL Server 2016 e nela foi restaurado o banco de dados do aplicativo a partir do backup ().
Configuração de acesso ao SQL Server na máquina virtual
Em seguida, era necessário tomar algumas medidas para permitir o acesso ao SQL Server externamente:
- Adicionar uma regra ao firewall para permitir solicitações à porta 1433.
- Preferencialmente, o acesso ao servidor deve ser feito não por autenticação do Windows, mas pelo SQL com login e senha (é mais fácil configurar o acesso). No entanto, nesse caso, não se deve esquecer de habilitar nas propriedades do SQL Server a possibilidade de autenticação SQL.
- Nas configurações do usuário no SQL Server, na aba User Mapping indicar para o banco restaurado o papel do usuário db_securityadmin.
Transferência de dados
Na verdade, a transferência de dados consiste em duas etapas:
- Transferência do esquema de dados (tabelas, visões, procedimentos armazenados, etc.)
- Transferência dos próprios dados
Transferência do esquema de dados
Realizamos as seguintes operações:
- Escolhendo Tasks -> Generate Scripts para o banco a ser transferido.
- Selecionamos os objetos necessários para a transferência ou deixamos o valor padrão (nesse caso, serão criados scripts para todos os objetos do banco).
- Indicamos as configurações para salvar o script. O mais conveniente é salvar o script em um único arquivo com codificação Unicode. Assim, em caso de falha, não será necessário repetir todas as etapas.
Após salvar o script, ele pode ser executado no SQL Server original (versão antiga) para criar o banco necessário.
Atenção: Após a execução do script, é necessário verificar se as configurações do banco a partir do backup estão de acordo com o banco criado pelo script. No meu caso, o script não tinha a configuração para COLLATE, o que resultou em falhas na transferência de dados e em manobras para recriar o banco com o script ajustado.
Transferência de dados
Antes de transferir dados, é necessário desativar a verificação de todas as restrições no banco:
EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'Transferimos os dados usando o assistente de importação de dados Tarefas -> Importar Dados no SQL Server onde o banco criado pelo script está localizado:
- Especificamos as configurações de conexão à origem (SQL Server 2016 em uma máquina virtual). Eu usei o Data Source SQL Server Native Client e a autenticação SQL mencionada anteriormente.
- Especificamos as configurações de conexão ao destino (SQL Server 2014 na máquina host).
- Em seguida, configuramos o mapeamento. É necessário selecionar todos não somente leitura objetos (por exemplo, não é preciso selecionar visualizações). Como opções adicionais, deve-se escolher "Permitir inserção em colunas de identidade", se tais colunas forem utilizadas.
Atenção: se ao tentar selecionar várias tabelas e definir a propriedade "Permitir inserção em colunas de identidade" a propriedade já tiver sido definida anteriormente para pelo menos uma das tabelas selecionadas, no diálogo será indicado que a propriedade já está configurada para todas as tabelas selecionadas. Esse fato pode confundir e levar a erros na transferência. - Iniciamos a transferência.
- Restauramos a verificação de restrições:
EXEC sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all'
Se ocorrerem erros, verificamos as configurações, removemos o banco criado com erros, o recriamos a partir do script, realizamos as correções e repetimos a transferência de dados.
Conclusão
Essa situação ocorre com bastante raridade e surge apenas devido às restrições mencionadas. Na maior parte das vezes, a solução é atualizar o SQL Server ou conectar-se a um servidor remoto, se a arquitetura do aplicativo permitir. No entanto, ninguém está a salvo de código legado e desenvolvimentos mal feitos. Espero que você não precise desta instrução, mas se precisar, que ela ajude a economizar muito tempo e nervos. Obrigado pela atenção!
Lista de fontes utilizadas
Fonte: habr.com
