Sincronizzazione tabelle tra 2 db SQL Server

venerdì 03 luglio 2009 - 10.58

lukepet Profilo | Junior Member

Vi chiedo una rapida consulenza.

Sto lavorando ad una applicazione che prevede una sincronizzazione di tabelle tra un db SQL Locale ed un db SQL Remoto. Il software si appoggia a dei servizi web per confrontare le sorgenti dati ed eventualmente generare degli update o degli insert.

Questo metodo funziona ma a livello di performance non è il massimo ed avevo intenzione di ottimizzarlo.

Vi chiedo se conoscete degli approcci migliori e consolidati per gestire la sincronizzazione tra tabelle in db SQL Server.

Qualsiasi informazione che avete mi sarà utile. Grazie.

alx_81 Profilo | Guru

>Vi chiedo una rapida consulenza.
>
>Sto lavorando ad una applicazione che prevede una sincronizzazione
>di tabelle tra un db SQL Locale ed un db SQL Remoto. Il software
>si appoggia a dei servizi web per confrontare le sorgenti dati
>ed eventualmente generare degli update o degli insert.
>
>Vi chiedo se conoscete degli approcci migliori e consolidati
>per gestire la sincronizzazione tra tabelle in db SQL Server.
Ciao,
ma il db locale "vede" quello remoto in TCP/IP? Se sì, fai senza web service..
e ci sono altre soluzioni.

>Qualsiasi informazione che avete mi sarà utile. Grazie.
di nulla!

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

lukepet Profilo | Junior Member

Altre soluzioni, del tipo?

alx_81 Profilo | Guru

>Altre soluzioni, del tipo?
Eh il tutto dipende dal fatto che i db si vedano o meno..

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

lukepet Profilo | Junior Member

Mmm non so se mi è molto chiaro il concetto di visibilità...

Comunque il db remoto accetta le connessioni remote ed io posso accederci tranquillamente via TCP/IP.

A questo punto dovrei interfacciarli tra loro. Come mi consigliate di fare?

Non avete da suggerirmi qualche link o documentazione da leggere?

alx_81 Profilo | Guru

>Comunque il db remoto accetta le connessioni remote ed io posso
>accederci tranquillamente via TCP/IP.
perfetto.. era quello che mi serviva
>A questo punto dovrei interfacciarli tra loro. Come mi consigliate
>di fare?
Puoi seguire varie strade, ti dicevo. Quelle più semplici sono, a mio avviso:

- Creazione di un sinonimo sul DB del destinazione che punta al server sorgente e poi creare una stored procedure (o un t-sql) che sincronizza, schedulato da un JOB
- Creazione di un SSIS che tenga allineate le tabelle schedulato tramite job
- Replica di sql server

che versione di sql hai?
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

lukepet Profilo | Junior Member

2005, però la versione locale è Express e quella Remota no.

alx_81 Profilo | Guru

>2005, però la versione locale è Express e quella Remota no.
Quello che va sincronizzato è il locale?
Solo one way?
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

lukepet Profilo | Junior Member

In realtà la sincronizzazione è bidirezionale...nel senso che un parte delle tabelle vanno sincronizzate da locale a remoto mentre altre tabelle vanno sincronizzate da remoto a locale. Dipende da che tipo di operazione si sceglie di fare con il programma.

alx_81 Profilo | Guru

>In realtà la sincronizzazione è bidirezionale...nel senso che
>un parte delle tabelle vanno sincronizzate da locale a remoto
>mentre altre tabelle vanno sincronizzate da remoto a locale.
>Dipende da che tipo di operazione si sceglie di fare con il programma.
In base ad ogni casistica, farei dei sinonimi su uno dei due db e quindi i linked server che ti servono. In quel modo poi basta scrivere direttamente con stored procedure sugli oggetti puntati dai sinonimi in un senso e leggere i dati letti dagli oggetti puntati dai sinonimi per poi scrivere sul db corrente. Quindi puoi pensare di farti con la CREATE SYNONYM (http://msdn.microsoft.com/it-it/library/ms177544.aspx) i tuoi puntatori, previa creazione di LINKED SERVER verso l'altro db server. Poi, le stored procedure che andrai a scrivere useranno direttamente i sinonimi per arrivare agli oggetti "remoti".
Fai attenzione perchè quando crei il linked server, devi usare un utente che possa leggere/scrivere anche sul db remoto.
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

lukepet Profilo | Junior Member

Ciao torno a risponderti dopo un pò che nel frattempo ho lavorato ad altre cose...ora sto di nuovo studiando questa faccenda della sincronizzazione.

Se ho ben capito, in base a ciò che mi hai detto tu ed in base a ciò che ho letto in giro, ho due strade percorribili per gestire la sincronizzazione. Una è quella che mi hai suggerito tu sfruttando i Linked Servers, l'altra è quella della Merge Replication.

Adesso sto facendo delle prove con i Linked Servers. In pratica mi sono creato un link al db remoto ed ho già visto che riesco a leggere i dati e a scriverli.

Ora stavo pensando a come gestire la sincronizzazione...per me sarebbe l'ideale creare una stored procedure che a partire da una selezione di dati dal db locale (sorgente) li confronti con il db remoto (destinazione). Se il record esiste allora fa un update altrimenti da un insert.

Secondo te questa operazione è facilmente realizzabile attraverso una stored procedure?

alx_81 Profilo | Guru

>Ciao
ciao

>Ora stavo pensando a come gestire la sincronizzazione...per me
>sarebbe l'ideale creare una stored procedure che a partire da
>una selezione di dati dal db locale (sorgente) li confronti con
>il db remoto (destinazione). Se il record esiste allora fa un
>update altrimenti da un insert.
bene

>Secondo te questa operazione è facilmente realizzabile attraverso una stored procedure?
vedo solo una EXISTS.. se il record con chiave comune non esiste, inserisco, altrimenti vedi se vuoi fare una update.

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

lukepet Profilo | Junior Member

Della Merge Replication che mi dici?

Ho letto un pò di documentazione, come soluzione mi sembra un pò articolata ma forse ha i suoi vantaggi rispetto all'utilizzo delle stored procedure.

Hai mai avuto modo di vederla in azione? E se si sai segnalarmi qualche tutorial a riguardo?

Scusa per le tante domande e grazie in anticipo per ogni info.

alx_81 Profilo | Guru

>Della Merge Replication che mi dici?
che evito sempre e comunque le repliche per i problemi di manutenzione che mi hanno sempre dato

>Hai mai avuto modo di vederla in azione? E se si sai segnalarmi qualche tutorial a riguardo?
noi abbiamo una replica transazionale, e sto cercando di rimuoverla con un servizio di distribuzione dati.

>Scusa per le tante domande e grazie in anticipo per ogni info.
ma figurati. Io seguirei un bel job di sql server schedulato, che lancia una sp o un ssis che fa questa operazione di sincronia.
Non ho un bel rapporto con le repliche.

Altra soluzione potrebbe essere il log shipping. Leggi qui se per caso potrebbe andare bene per il tuo caso:
http://msdn.microsoft.com/en-us/library/ms190016(SQL.90).aspx

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5