Este não é um post tutorial para explicar a migração de um banco de dados MySQL para o SQL Server da Microsoft. Apenas quero registrar algumas dicas e armadilhas que encontrei nesse processo.
Eu migrei dois aplicativos web: A intranet da empresa onde trabalho e meu site sobre MMOGs. Ambos usavam MySQL 5.1 acessado pelo Entity Framework do .NET.
Estrutura
Eu poderia ter usado a ferramenta de migração da Microsoft mas preferi criar um Database Project no Visual Studio 2010. Para isso usei o SQL Create Script do MySQL Workbench para exportar o modelo. Feito isso, eu copiei cada CREATE TABLE do MySQL para um arquivo do tipo Table do Database Project, separando as Constraints e Índices. Nessa etapa, no meu caso, foi tranquilo já que a sintaxe do Create do MySQL é parecida com o SQL Server, ficando ajustes apenas nos tipos de dados.
Aqui vem o primeiro cuidado. No Create Script do MySQL Workbench as Constraints são criadas com o comando Create Table em uma seqüencia específica para que as referências sempre existam:
CREATE TABLE IF NOT EXISTS `Departamento` (
`ID` INT NOT NULL AUTO_INCREMENT ,
`EmpresaID` INT NOT NULL ,
`Nome` VARCHAR(64) NOT NULL ,
PRIMARY KEY (`ID`) ,
INDEX `fk_empresa_departamento_empresa1` (`EmpresaID` ASC) ,
CONSTRAINT `fk_empresa_departamento_empresa1`FOREIGN KEY (`EmpresaID` )
REFERENCES `Empresa` (`ID` )ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
Departamento.table.sql:
CREATE TABLE [dbo].[Departamento]
(
ID INT PRIMARY KEY IDENTITY(1,1) ,
EmpresaID INT NOT NULL ,
Nome VARCHAR(64) NOT NULL
)
Departamento.fkey.sql:
ALTER TABLE [dbo].[Departamento]
ADD CONSTRAINT FK_Departamento_EmpresaID
FOREIGN KEY (EmpresaID)
REFERENCES Empresa(ID)
ON DELETE NO ACTION
ON UPDATE NO ACTION
CREATE INDEX IX_Departamento_EmpresaID
ON [dbo].Departamento (EmpresaID)
O próximo passo então é fazer o Deploy para o banco de dados através do comando com o mesmo nome no Visual Studio. O Deploy é muito bacana, principalmente quando nosso Database Project faz parte de uma solução e isso agiliza todo o processo de alterar banco de dados e atualizar o Entity Data Model, por exemplo.
Entity Data Model
Dados
- complete-insert
- hex-blob
- no-create-info
Os comando de Insert gerados são compatíveis com o SQL SERVER mas algumas substituições nas seqüencias de escape são necessárias:
- Troque \' por '' (dois apóstrofos)
- Troque \" por " (aspas)
- Troque \\ por \
Além disso acrescente no início do script de cada tabela:
SET IDENTITY_INSERT <NomeDaTabela> ON
e no final:
SET IDENTITY_INSERT <NomeDaTabela> OFF
Dependendo do formato de datas gerado pelo backup do MySQL Workbench e do formato existente no SQL Server, será necessário usar o seguinte comando no início dos scripts:
SET DATEFORMAT ymd
No caso acima, o script gerado pelo MySQL tem datas nos formato YYYY-MM-DD e informa ao SQL Server que a conversão de varchar para datetime encontradas deverão assumir que os valores do ano, mes e dia estão na sequencia ymd.
Pronto, minha migração está concluída!
No meu caso esse processo foi fácil, em boa parte, porque meus projetos estão baseados no Entity Framework.
Próximo passo: Code-First!