Atom Feed RSS Feed

Il mio profilo

My Photo
Name: blog
Location:

Transfer SMO e SQL Server 2008

postato da blog.cyberman.it [19/11/2008 09:18]

Ho avuto la necessità di trasferire un DB da un server ad un altro.

Il Target server aveva però una collation differente dal server sorgente.

Le stored procedure che usano tabelle temporanee appoggiano i dati nel database TempDB e quindi avvengono dei conflitti nel confronto delle stringhe di un DB con i dati nelle tabelle temporanee di TempDB.

Per questo motivo una copia del DB da Detach e Attach o da Backup e Restore NON era utilizzabile.

L'idea iniziale era quella di creare un programma che esportasse script di creazione di tutti gli oggetti e i dati del DB sorgente epoi li rieseguisse sul DB destinazione.

Alla fine ho scoperto la Tecnologia SMO che espone il DB come modello di classi .NET.

Tra queste classi ce ne sono alcune che servono proprio al trasferimento di Database, Oggetti e Dati.

Ho avuto un pò di difficoltà perchè SQL Server 2008, lato CLIENT, necessita di librerie SMO differenti rispetto a quelle per SQL Server 2005.

Nel Mio Project ho referenziato tutti gli assembly in questa cartella:

C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies

Qualora si stesse compilando per x86 su una macchina x64 allora occorre prendere gli assembly da:

C:\Program Files (x86)\Microsoft SQL Server\100\SDK\Assemblies

Se NON avete questa cartella dovete installareil Microsoft SQL Server 2008 Management Objects che trovate a questo indirizzo:

http://www.microsoft.com/downloads/details.aspx?FamilyID=228de03f-3b5a-428a-923f-58a033d316e1&displaylang=en

Alla fine il codice necessario è veramente molto breve:

 

HTML clipboardHTML clipboard

Server svr = new Server(@"SERVER_SORGENTE");

Database db = svr.Databases["DB_SORGENTE"];

Transfer t = new Transfer(db);

t.CopyAllObjects = true;

t.DropDestinationObjectsFirst = true;

t.CopySchema = true;

t.CopyData = true;

t.DestinationServer = "SERVER_DESTINAZIONE";

t.DestinationDatabase = "DB_DESTINAZIONE";

t.Options.NoCollation = true; // Non si porta dietro le informazioni per la Collation

t.Options.IncludeIfNotExists = true;

t.TransferData();


Ho realizzato una piccola applicazione che rende le cose un pò più semplici.

 

 

Questa applicazione è disponibile per il Donwload a questo indirizzo.