Transferindo dados de backup de uma nova versão do MS SQL Server para uma versão mais antiga

Pré-história

Certa vez, para reproduzir um bug, precisei de um backup do banco de dados de produção.

Para minha surpresa, encontrei as seguintes limitações:

  1. O backup do banco de dados foi feito na versão SQL Server 2016 e não era compatível com o meu SQL Server 2014.
  2. No meu computador de trabalho, o sistema operacional usado foi Windows 7então não consegui atualizar SQL Server até a versão 2016
  3. O produto suportado fazia parte de um sistema maior com uma arquitetura herdada fortemente acoplada e também se comunicava com outros produtos e bases, portanto, poderia levar muito tempo para implantá-lo em outra estação.

Diante do exposto, cheguei à conclusão de que chegou a hora de muletas de soluções não padronizadas.

Restaurando dados de um backup

Eu escolhi usar uma máquina virtual Oracle VM VirtualBox com o Windows 10 (você pode tirar uma imagem de teste para o navegador Edge por isso). O SQL Server 2016 foi instalado na máquina virtual e o banco de dados do aplicativo foi restaurado a partir do backup (instrução).

Configurando o acesso ao SQL Server em uma máquina virtual

Em seguida, foi necessário seguir alguns passos para poder acessar o SQL Server de fora:

  1. Para o firewall, adicione uma regra para ignorar solicitações de porta 1433.
  2. É desejável que o acesso ao servidor não passe pela autenticação do Windows, mas sim pelo SQL usando login e senha (é mais fácil configurar o acesso). No entanto, neste caso, você precisa se lembrar de habilitar a Autenticação do SQL nas propriedades do SQL Server.
  3. Nas configurações do usuário no SQL Server na guia Mapeamento do usuário especifique a função do usuário para o banco de dados restaurado db_securityadmin.

Transferência de dados

Na verdade, a própria transferência de dados consiste em duas etapas:

  1. Transferência de esquema de dados (tabelas, exibições, procedimentos armazenados, etc.)
  2. Transferindo os dados em si

Transferência de esquema de dados

Realizamos as seguintes operações:

  1. selecionar Tarefas -> Gerar Scripts para uma base portátil.
  2. Selecione os objetos que deseja transferir ou deixe o valor padrão (neste caso, serão criados scripts para todos os objetos do banco de dados).
  3. Especifique as configurações para salvar o script. É mais conveniente salvar o script em um único arquivo Unicode. Então, em caso de falha, você não precisa repetir todas as etapas novamente.

Uma vez salvo o script, ele pode ser executado no SQL Server original (versão antiga) para criar a base necessária.

Nota: Depois de executar o script, você precisa verificar a correspondência entre as configurações do banco de dados do backup e o banco de dados criado pelo script. No meu caso, não havia configuração para COLLATE no script, o que levou a uma falha na transferência de dados e dançando com um pandeiro para recriar o banco de dados usando o script complementado.

Transferência de dados

Antes de transferir dados, você deve desabilitar a verificação de todas as restrições no banco de dados:

EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'

A transferência de dados é realizada usando o assistente de importação de dados Tarefas -> Importar dados no SQL Server, onde está localizado o banco de dados criado pelo script:

  1. Especifique as configurações de conexão com a origem (SQL Server 2016 em uma máquina virtual). eu usei fonte de dados Cliente Nativo do SQL Server e a autenticação SQL acima mencionada.
  2. Especifique as configurações de conexão para o destino (SQL Server 2014 na máquina host).
  3. Em seguida, configure o mapeamento. Todos devem ser selecionados não somente leitura objetos (por exemplo, vistas não precisam ser selecionadas). Como opções adicionais, selecione "Permitir inserção em colunas de identidade"se forem usados.
    Nota: se, ao tentar selecionar várias tabelas e definir suas propriedades "Permitir inserção em colunas de identidade" a propriedade já foi definida para pelo menos uma das tabelas selecionadas, o diálogo indicará que a propriedade já foi definida para todas as tabelas selecionadas. Esse fato pode ser confuso e levar a erros de migração.
  4. Iniciamos a transferência.
  5. Restaurando a verificação de restrição:
    EXEC sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all'

Se ocorrer algum erro, verificamos as configurações, excluímos o banco de dados criado com erros, recriamos a partir do script, fazemos correções e repetimos a transferência de dados.

Conclusão

Essa tarefa é bastante rara e ocorre apenas devido às limitações acima. A solução mais comum é atualizar o SQL Server ou conectar-se a um servidor remoto se a arquitetura do aplicativo permitir. No entanto, ninguém está imune ao código legado e às mãos desonestas do desenvolvimento de baixa qualidade. Espero que você não precise desta instrução, mas se ainda precisar, ajudará a economizar muito tempo e nervos. Obrigado pela sua atenção!

Lista de fontes usadas

Fonte: habr.com