segunda-feira, 20 de dezembro de 2010

SQL Server: Utilitário tablediff ('Sincronizando Replicações')

Companheiros(as), hoje vou comentar sobre um utilitário nativo a partir do SQL Server 2000 que possibilita exportar comandos de insert, update e delete para ressincronizar informações de uma publicação/assinatura.

Este utilitário chama-se tablediff*, e pode nos salvar nas situações onde as informações entre objetos publicados e sua réplica estão inconsistentes.

A idéia deste post não é apenas comentar sobre a existência do utilitário, mas possibilitar que você meu amigo(a) possa solucionar seus problemas de maneira mais facilitada.

O script abaixo servirá para automatizar esta atividade, e deve ser executado na base de dados replicada.

Narrando o script: a partir de um SELECT são informados o caminho onde o executável do utilitário é encontrado, os comandos do utilitário que estão separados para o servidor da publicação e replicado, respectivamente (-sourceserver Source Host; -sourcedatabase Source Database; -sourceschema Source Schema Name; -sourcetable Source Table or View; -sourceuser Source Login; -sourcepassword Source Password; -destinationserver Destination Host -destinationdatabase Destination Database, -destinationschema Destination Schema Name, -destinationtable Destination Table or View, -destinationuser Destination Login, -destinationpassword Destination Password), o comando de exportação dos comandos (-f) e a palavra-chave [name] que no momento da execução será substituída pelo nome do objeto replicado.

DECLARE Script

CURSOR FOR

SELECT '"c:\Program Files\Microsoft SQL Server\100\COM\tablediff.exe"

-sourceserver IPservidorpublicacao

-sourcedatabase nomedatabasepublicacao

-sourceschema dbo -sourcetable ' + name + '

-sourceuser usuariodeconexao -sourcepassword passworddeconexao

-destinationserver IPservidorreplica

-destinationdatabase nomedatabasereplica

-destinationschema dbo

-destinationtable ' + name + '

-destinationuser usuariodeconexao

-destinationpassword passworddeconexao

-f F:\Temp\Diff\' + name + '.sql' FROM SYS.tables

DECLARE @Comando VARCHAR(1000)

OPEN Script

FETCH NEXT FROM Script INTO @Comando

WHILE @@FETCH_STATUS = 0

BEGIN

SET @Comando = 'xp_cmdshell '''+@Comando+''''

EXEC(@Comando)

FETCH NEXT FROM Script INTO @Comando

END

CLOSE Script

DEALLOCATE Script

Da maneira que o script está acima, o mesmo vai seguir com a análise de todos os objetos da base replicada, se porventura sua idéia é analisar apenas alguns objetos, sugiro trocar o comandoEXEC(@Comando) porPRINT(@Comando) assim, na execução da query poderá visualizar um comando para cada objeto, e utilizar um(1) a um(1) no processo de análise.

*Para conhecer um pouco mais sobre o utilitário e os comandos utilizados, acessem o sitehttp://msdn.microsoft.com/pt-br/library/ms162843.aspx

Espero que o post seja útil para você em algum momento, afinal automatizamos o processo utilizando CURSOR, para mim já foi de grande utilidade.

Abraços e até mais

Bruno Santos

Nenhum comentário:

Postar um comentário