Archive for the 'SQL Server 2005' Category

Può capitare di dover eseguitre le repliche transazionali programmaticamente da una pagina asp.net o da un webservice .net (perchè? vari motivi :) )

Con SQL Server 2000 era un grosso problema perchè il database server non offriva particolari strumenti ma con la 2005 è tutto molto più semplice potento sfruttare direttamente gli assembly .NET che lo stesso SQL Server Management Studio usa per performare queste azioni.

I namespace da usare sono:
using Microsoft.SqlServer.Replication;
using Microsoft.SqlServer.Management.Common;

Cominciamo con avere la lista delle repliche transazionali attive sul database server: 

  1. DataSet subscriptions = null;
  2. using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
  3. {
  4.    ServerConnection serverConn = new ServerConnection(conn);
  5.    ReplicationMonitor monitor = new ReplicationMonitor(serverConn);
  6.    monitor.LoadProperties();
  7.    monitor.PublisherMonitors[0].LoadProperties();
  8.    subscriptions = monitor.PublisherMonitors[0].EnumSubscriptions(PublicationType.Transactional, SubscriptionResultOption.AllSubscriptions);
  9. }
  10. return subscriptions;

La classe ReplicationMonitor offre la possibilità di avere la lista delle repliche, come in questo caso, partendo dal Publisher server prendendo come esempio una Push Subscription installata sul Publisher stesso. Il metodo LoadProperties() è importantissimo e permette di popolare la collection PublisherMonitors.

Il metodo EnumSubscriptions torna un DataSet con una sola tabella popolato con le proprietà delle repliche transazionali disponibili. Di seguito le colonne “principali” che servono per eseguire una replica:
- publication: nome della replica
- subscriber: nome SQL del subscriber della replica
- subscriber_db: nome database a cui punta la replica
- last_distsync: data ultima replica
- status: stato della replica (enum ReplicationStatus)
- warning: avviso di stato della replica (enum ReplicationWarnings)

Per lanciare la replica:

  1. using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
  2. {
  3.   ServerConnection serverConn = new ServerConnection(conn);
  4.   TransSubscription s = new TransSubscription();
  5.   s.ConnectionContext = serverConn;
  6.   s.PublicationName = publicationName;
  7.   s.DatabaseName = s.ConnectionContext.DatabaseName;
  8.   s.SubscriberName = subscriberName;
  9.   s.SubscriptionDBName = subscriberDataBaseName;
  10.   s.ConnectionContext.Connect();
  11.   s.SynchronizeWithJob();
  12.   s.ConnectionContext.Disconnect();
  13. }

L’operazione è asincrona quindi è necessario aggiornare la lista delle repliche ogni 1-2 secondi (infatti neanche il Replication Monitor del Management Studio non da lo stato della replica in realtime).

Buona replica :D