RedGate – SQL COMPARE na prática

Fala Galera,

Image

              Vocês já devem ter ouvido falar das maravilhosas ferramentas da Redgate, seja o SQL Prompt, SQL Data Compare, SQL Backup ou qualquer outra.

Pois bem, hoje vou apresentar para vocês um chamado SQL Compare que nos permite sincronizar objetos entre dois bancos de dados. Você poderá fazer o download do Trial desse software em http://www.red-gate.com/products/sql-development/sql-compare/ .

Digamos que você possua um ambiente de desenvolvimento e um ambiente de homologação e gostaria que no final de cada fase do seu projeto as alterações da base de dados de desenvolvimento (DB1) serão aplicadas ao banco de homologação (DB2), e claro, para apresentarmos um cenário mais real, simularemos esta atualização estrutural em tabelas que já possuam dados.

Após instalar o programa e executado, iremos estabeleces uma conexão com cada um dos servidores e DBS. Nosso exemplo será baseado em duas bases que estão no mesmo servidor, mas nada impede que os servidores estejam separados e se comunicando via internet. Usaremos o DB1 como fonte e o DB2 como alvo de atualizações.

Image

Agora vamos criar as estruturas básicas para nossos exemplos:

CREATE DATABASE DB1

GO

USE DB1

GO

CREATE TABLE dbo.Clientes(

id int IDENTITY(1,1) PRIMARY KEY,

nome varchar(100),

dataNasc datetime

)

/*db 2*/

CREATE DATABASE DB2

GO

USE DB2

GO

CREATE TABLE dbo.Clientes(

id int IDENTITY(1,1) PRIMARY KEY,

nome varchar(100),

dataNasc datetime

)

Ambos as bases terão a tabela dbo.Clientes, agora vamos criar uma tabela de endereços que só existirá no DB2.

USE DB2

GO

CREATE TABLE Enderecos

(

id INT IDENTITY(1,1)PRIMARY KEY,

rua VARCHAR(100),

numero INT,

id_participante INT REFERENCES dbo.Clientes(id)

)

GO

Ao clitar em ‘refresh’ voce notará que existem duas principais divisões dos tipos de objetos apresentados na tela, são eles: Objetos Identicos e objetos que não existe em um dos servidores. Note que a tabela de clientes é apresentada como um objeto identico em ambas as bases; já a tabela de endereços (que só existe no DB2), está em uma categoria separada.

Image

Até aqui ok. Agora, na tabela dbo.enderecos no DB2 vamos criar um índice:

CREATE INDEX ix_rua_numero ON enderecos (rua,numero)

Volte ao SQL Compare e clique em refresh e clique em cima do objeto “Endereços” conforme a imagem abaixo. Você pode notar que a estrutura completa da tabela e novo índice são apresentados.

Image

Crie outro objeto de banco de dados, uma procedure por exemplo:

/*cria proc*/

CREATE PROCEDURE usp_consultarua(

@rua varchar(100),

@numero INT

) AS begin

SELECT rua, numero FROM enderecos WHERE rua = @rua AND numero = @numero

END

Novamente clique no refresh e observe a listagem do novo objeto.

Image

Crie um novo login/user para este DB:

/*cria um usuário*/

CREATE LOGIN dhiego WITH password = 'P!r0T@123'

CREATE USER dhiego FOR LOGIN  dhiego

Novamente clique no refresh e observe a listagem do novo objeto.

Image

Vamos complicar as coisas, crie agora no DB1 uma tabela chamada dbo.Enderecos , porém como uma estrutura diferente da existente no DB2.

USE DB1

go

CREATE TABLE Enderecos(

id INT IDENTITY(1,2)PRIMARY KEY,

rua VARCHAR(90),

numero INT,

id_Cliente INT REFERENCES dbo.Clientes(id)

)

GO

Novamente clique no refresh e observe a listagem do novo objeto.

Image

Note que uma nova divisão surgir, representada pelo sinal matemático ‘diferente’. Clique no objeto que está sendo apresentado como sendo diferente entre os DBS e duas novas colunas serão mostradas, na parte inferior da tela, com o script de cada uma das tabelas. As palavras grifadas são as que possuem divergências.

Equalizando as bases

Iremos sincronizar as duas bases, porém somente selecione os objetos que existem no DB2 e não existem no DB1,  e clique em ‘synchronization wizard’.

Image

Selecione a opção Synchronize using SQL compare e clique em next.

Image

Note que existe um checkbox que indica que os objetos que possuem dependências com o que você está atualizando deverão ser também atualizados, no nosso caso a tabela dbo.Enderecos tem dependência com a procedure USP_consultaRua. Caso nós mantivermos esta opção selecionada alguns avisos serão dados:

Image

Por exemplo, como temos uma diferença nos tamanhos do campo ‘rua’ ele nos avisa da existência de um erro de severidade alta, onde os dados existentes na tabela poderiam ser truncados; Além dessas, outras informações de menor impacto são apresentadas.

Não faremos a sincronização com esta opção habilitada, portanto clique em voltar e desmarque a opção de atualizar os objetos desentendes. Novamente avance e sincronize as bases.

Image

Será dado um último aviso sobre as alterações. Confirme.

Após finalizar a sincronização uma nova consulta será executada e, caso existam ainda diferenças, elas serão listadas.

Image

Em nosso caso ainda possuímos as diferenças na tabela de Endereços; mas, antes de a atualizarmos, vamos inserir alguns dados na tabela que já existe no DB2.

USE DB2

GO

INSERT INTO dbo.Enderecos

( rua, numero, id_participante )

VALUES  ( 'Caracteres 100 Caracteres 100 Caracteres 100 Caracteres 100 Caracteres 100 Caracteres 100 Caracteres',

123,

null

)

GO 5

No insert acima, o campo rua está recebendo uma string com  100 caracteres, e a tabela que será incronizada só tem capacidade pra 90. Vamos observar como o programa lida com essa situação, então faça a nova sincronização, seguindo os mesmos passos anteriores.

Observe os avisos sobre possiveis problemas da sincronia e avance.

O seguinte erro foi obtido:

Image

Através dele podemos compreender como funciona a atualização de uma tabela. Podemos observar que ele cria uma tabela temporária (tmp_rg_xx_enderecos) e faz a insercao dos dados existentes na enderecos, dessa forma garantindo que os dados permaneçam intactos.

Agora vamos dropar a tabela do DB1 e recria-la, com os campos de tamanho maior.

USE DB1

go

DROP TABLE Enderecos

go

CREATE TABLE Enderecos(

id INT IDENTITY(1,1)PRIMARY KEY,

rua VARCHAR(110),

numero bigint,

id_Cliente INT REFERENCES dbo.Clientes(id)

)

GO

Feche a mensagem de erro e qualquer outra janela aberta, vamos voltar para a tela principal que está listando os objetos. Siga os mesmos passos que fizemos até agora,  e tente sincronizar os objetos novamente, você notará que uma nova janela com o script será apresentada:

Image

Clique em “synchronize now” e pronto! Agora validar como está a estrutura da dbo.Enderecos no DB1 e no DB2

USE DB1
GO
sp_help enderecos

Image

USE DB2
GO
sp_help enderecos

Image

Neste artigo apresentei uma pequeníssima parcela das funcionalidades do SQL Compare.

Por hora é isso!

Abraços.

Anúncios

Sobre dhiegopiroto
Graduando em Sistemas de Informação, apaixonado por tecnologia, literatura e musica. Possui experiencia com desenvolvimento em T-SQL, XML, XSD e administração de bancos de dados SQL Server; Detém os titulos de MCP e MCTS SQL Server 2008.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

Alex Souza

Banco de dados, Business Intelligence, Big Data, Governança de TI ... /* Um eterno aprendiz... */

Blog - Thiago Carlos de Alencar

Aprendendo SQL Server !

SQL Authority with Pinal Dave

SQL Server Performance Tuning Expert

Vitor Fava

SELECT (CrazyIdeas*2), (InsaneIdeas*100), MyExperience FROM MyBigHead WHERE InsaneLevel > 1000

Think Think SQL

DBCC DumpMemory 'TECH','ALL'

Gustavo Maia Aguiar

Artigos, dicas e algumas reflexões sobre o SQL Server

Kimberly L. Tripp

DBCC DumpMemory 'TECH','ALL'

Thiago Zavaschi R2

www.zavaschi.com

Blog do Luti

DBCC DumpMemory 'TECH','ALL'

Luan.Moreno a.k.a [SQL.Soul]

Lead Database Consultant at Pythian

Blog do Leka

let's make things better

%d blogueiros gostam disto: