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!

Blob do SQL Server truncados no PHP

Hello folks, depois de um bom tempo sem postar nada vai ai uma dica de configuração do PHP com SQL Server. Essa dica é para quem está recuperando um blob (varbinary, image, etc) e quando é exibido pelo PHP vem truncado… exibindo parte da imagem e o resto em cinza indicando que ali teria que ter algo =]. Para resolver basta alterar o valor das propriedades mssql.textlimit e mssql.textsize no php.ini. Lembrando que os valores estão em bytes.

Abrasss

Windows Firewall e conexões remotas no SQL Server 2008

Salve, salve!! Depois de um intervalo sem postar nada, deixo aqui uma dica rápida para liberar conexões remotas no SQL Server 2008. Crie um arquivo bat com o conteúdo:

@echo =========  SQL Server Ports  ===================
@echo Enabling SQLServer default instance port 1433
netsh firewall set portopening TCP 1433 "SQLServer"
@echo Enabling Dedicated Admin Connection port 1434
netsh firewall set portopening TCP 1434 "SQL Admin Connection"
@echo Enabling conventional SQL Server Service Broker port 4022
netsh firewall set portopening TCP 4022 "SQL Service Broker"
@echo Enabling Transact-SQL Debugger/RPC port 135
netsh firewall set portopening TCP 135 "SQL Debugger/RPC"
@echo =========  Analysis Services Ports  ==============
@echo Enabling SSAS Default Instance port 2383
netsh firewall set portopening TCP 2383 "Analysis Services"
@echo Enabling SQL Server Browser Service port 2382
netsh firewall set portopening TCP 2382 "SQL Browser"
@echo =========  Misc Applications  ==============
@echo Enabling HTTP port 80
netsh firewall set portopening TCP 80 "HTTP"
@echo Enabling SSL port 443
netsh firewall set portopening TCP 443 "SSL"
@echo Enabling port for SQL Server Browser Service's 'Browse' Button
netsh firewall set portopening UDP 1434 "SQL Browser"
@echo Allowing multicast broadcast response on UDP (Browser Service Enumerations OK)
netsh firewall set multicastbroadcastresponse ENABLE

Execute o bat e seja feliz! Abraços

Editado
Tinha esquecido de colocar o link de onde vem o script original: http://support.microsoft.com/kb/968872