SQL Server: Migrando dados entre schemas diferentes

Fala pessoal! Depois de um longo tempo sem postar nada … estou de volta!!

Recentemente participei do projeto de integração entre 4 sistemas e unificação de suas bases de dados. Nessa base, nós dividimos as tabelas de alguns dos módulos específicos utilizando os schemas do SQL Server.

Vamos lá! O cenário é o seguinte: Temos bases diferentes onde o único schema é o dbo. Ao unificarmos as bases, deseja-se separar alguns objetos com schemas próprios (diferentes do dbo). Não consegui encontrar nenhuma ferramenta free que fizesse o trabalho completo e no meu caso e acredito que no caso de muitos, é complicado pagar um preço relativamente alto pra usar uma ferramento 1 ou 2 vezes apenas. Por esse motivo adotei essa solução.

Vou partir do principio que a nova base já está com a estrutura pronta e só é necessário importar os dados da base antiga.

1º Passo é gerar o script com os dados. Um espécie de “backup” … comum em outros SGBDs como PostgreSQL e MySQL.
Para tal, Clique com o botão direito na base que deseja exportar os dados e escolha a opção Tasks > Generate Scripts, como mostra a imagem abaixo:

Como só interessam os dados, escolha apenas as tabelas que deseja exportar. Na próxima tela, marque as opções “save to file”, “single file” e clique em “Advanced”. Nessa tela, você deverá mudar as propriedades: “Schema qualify object names” para “false”, “Script USE DATABASE” para “false” e por último “Types of data to script” para “data only”, como mostra a imagem abaixo:

Mas porque retirar o nome do schema e o “USE DATABASE”? Se o arquivo gerado for muito grande, maior que 2 GB por exemplo, você terá dificuldade para altera-lo em um editor de textos depois e lembre-se que você quer mudar de schema e não continuar com o dbo e a base destino também é diferente. Ah, eu poderia mudar o schema direto na minha base antiga e já exportar certinho? Claro que pode, mas como ainda trata-se da base de produção, quanto menos modificações, melhor … por isso prefiro alterar apenas o script que não causa nenhum impacto na estrutura atual.

Feito isso, pode gerar o script. A depender do tamanho da base, vai demorar um pouco.

2º Passo, depois do script gerado, nós vamos desativar temporariamente todas constraints e triggers. Para tal, você irá precisar rodar os seguintes comandos SQL:

EXEC sp_msforeachtable "ALTER TABLE ? DISABLE TRIGGER ALL"
GO

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT ALL"
GO

3º Passo, existe um detalhe muito importante agora, como usar o schema se não tem nenhuma referencia no script? O pulo do gato está no default schema do usuário que você irá utilizar na importação. Defina o default schema para o desejado  antes de executar o script de importação.

Agora você tem duas opções: Rodar pelo Management Studio ou pelo linha de comando com o sqlcmd.exe. Se o script for muito grande, você terá que usar o sqlcmd.
Sintaxe: sqlcmd.exe -S <host> -U <usuario> -P <senha> -d <banco destino> -b -i <caminho para o script> -o <log de saída>

Novamente, a depender do tamanho da base, o processo pode levar horas.
Se tudo deu certo até aqui, você já pode habilitar novamente as triggers e contraints:

EXEC sp_msforeachtable "ALTER TABLE ? ENABLE TRIGGER ALL"
GO

EXEC sp_msforeachtable "ALTER TABLE ? CHECK CONSTRAINT ALL"
GO

4º Passo, se tudo deu certo, vai no barzinho mais próximo e pede uma gelada!! \o/
Abrassssss galera!