Così come succedeva con
SQL Server 2000, anche con la versione 2005 è possibile gestire l’importazione/esportazione guidata dei dati. Può infatti essere utile, tramite interfaccia, copiare dati tra tabelle o creare tabelle di destinazione prima di copiarvi i dati selezionati, anche tramite query ad hoc. Nello scenario che illustrerò in questo tip, trasferirò solamente dati da un
sql server 2005 ad un altro, ma l’utility permette molti altri tipi di trasformazioni (file flat, excel, access, db2 – per chi ha il provider installato, ecc..)
Come accedere all’utility Import/Export Wizard ?
Premendo il tasto destro su di un database è possibile accedervi così come indicato nell’immagine qui sotto.
Selezionare “Importa Dati..” o “Esporta Dati..”(Import Data o Export Data) considerando che il database selezionato può essere sorgente o destinazione dell’operazione da eseguire (anche se non selezioniamo il db corretto, avremo poi la possibilità di cambiare i dati di connessione).
Scenario
Supponiamo di avere due database, chiamati rispettivamente
DataBase_1 e
DataBase_2, i quali posseggono almeno una tabella in comune (stessa struttura, dati anche diversi) che chiameremo genericamente “Dati”. La tabella avrà i seguenti campi:
CREATE TABLE Dati
(
id int IDENTITY(1,1) PRIMARY KEY CLUSTERED,
Nome varchar(30) NOT NULL,
Cognome varchar(30) NOT NULL,
Eta tinyint NOT NULL
)
Sul
DataBase_1 le righe nella tabella Dati sono le seguenti:
Mentre sul
DataBase_2:
Avremo i seguenti possibili casi:
- Copia di dati tra tabelle identiche- Copia di dati con creazione tabella di destinazione- Copia di dati con l’ausilio di una query ad hocPer ognuno dei tre scenari, seguire le seguenti operazioni comuni:
1) Eseguire la tool di importazione/esportazione guidata. Ad esempio clickare su “Esporta dati” (in base alla scelta cambia l’ordine delle finestre del wizard)
2) Selezionare quale provider/server/database impostare come sorgente, nel nostro caso, provider di SQL Server 2005 nativo (Native client), server locale,
DataBase_13) Selezionare la destinazione, nel nostro caso provider di SQL Server 2005 nativo (Native client), server locale,
DataBase_2:
Ora passiamo, nello specifico ai casi.
Copia di dati tra tabelle identiche
Per copiare i dati da una o più tabelle sorgenti su di una o più tabelle di destinazione, selezionare la seguente modalità di copia:
Passiamo alla finestra successiva, andiamo a selezionare gli oggetti sorgente e ad associarli con quelli di destinazione (sono identici, a parità di nome vengono proposti gli oggetti di destinazione che lo hanno uguale). Nell’esempio prendiamo solo la tabella Dati, che è l’unica presente in entrambi i database.
Il pulsante Modifica Mapping definisce quali colonne di origine devono essere copiate verso colonne di destinazione e inoltre consente di selezionare alcune importanti opzioni aggiuntive, riassunte nella maschera qui di seguito:
Da notare che la colonna id è identity. In corrispondenza del suo mapping è stata selezionata la voce
come destinazione. Questo per evitare errori in fase di esecuzione del pacchetto finale (gli identity, se non diversamente impostato, sono read only, quindi non vanno “mappati” altrimenti si avrà un errore a runtime durante il trasferimento dati). L’associazione per gli altri campi è già pronta, poiché gli oggetti di sorgente e destinazione sono gli stessi. È possibile comunque cambiare l’ordine di mapping delle colonne (ad esempio, potremmo invertire nome e cognome), facendo attenzione ad associare campi con datatype compatibili.
Le opzioni avanzate delle quali si può usufruire sono Accoda righe alla tabella di destinazione oppure Elimina righe dalla tabella di destinazione che permettono di eseguire operazioni di append sulla destinazione oppure pulirla per poi riempirla con le nuove righe. Selezionando l’eliminazione delle righe, eventuali campi identity ripartono dal valore iniziale impostato per la tabella. Con il check Consenti IDENTITY_INSERT poi, possiamo forzare lo stesso valore di un campo identity della sorgente sulla destinazione.
A questo punto, possiamo proseguire alla finestra successiva:
L’utente può scegliere se eseguire immediatamente il pacchetto (poiché viene creato un vero e proprio SSIS) oppure salvarlo, ed in questo caso si attivano ulteriori opzioni:
Tipo di salvataggio, su filesystem con file *.dtsx oppure su SQL Server, registrato direttamente su server di Integration Service).
Tipo di crittografia, per la protezione dei dati sensibili (selezionando protezioni con password, si abilita l’inserimento della password con cui criptare i dati).
Ecco una tabella riassuntiva dei tipi di protezione
1 - Non salvare dati riservati (Do not save sensitive)
Elimina le informazioni riservate quando si salva il package. Tutte le proprietà del SSIS che sono segnate come riservate non vengono salvate e quindi ogni utente che accede deve fornire queste informazioni (ad esempio le credenziali di connessione ai db server)
2 - Crittografia di tutti i dati riservati con una chiave utente (Encrypt sensitive with user key)
Cripta i dati riservati nel package utilizzando la chiave dell’utente corrente. Solo quell’utente con quel profilo che ha salvato il SSIS, può aprirlo e disporre dei dati riservati. Appena un nuovo utente apre e salva il pacchetto tutte le informazioni riservate vengono salvate a blank. Quindi l’esecuzione del SSIS fallisce a meno che non vengano reinseriti i dati.
3 - Crittografia di tutti i dati riservati con una password (Encrypt sensitive with password)
I dati riservati vengono criptati con una password scelta dall’utente che salva il package e salvati con il package stesso. Per aprire il SSIS è necessario conoscere la password. Se si apre il pacchetto senza la password corretta, l’utente deve inserire i nuovi dati riservati. Se non lo fa, il package fallisce all’esecuzione
4 - Crittografia di tutti i dati con una chiave utente (Encrypt all with user key)
Come il 2, ma i dati criptati comprendono tutto il package
5 - Crittografia di tutti i dati con una password (Encrypt all with password)
Come il 3, ma i dati criptati comprendono tutto il package
L’ultima schermata è quella di riassunto, con la quale controllare se le operazioni sono effettivamente quelle che ci aspettiamo.
Una volta dato l’OK, avremo un log con tutte le operazioni eseguite e gli eventuali warning/errori con tanto di messaggi di aiuto per comprendere quale evento li abbia scatenati.
Copia di dati con creazione tabella di destinazione
Riprendiamo dalla scelta degli oggetti, ma stavolta selezioniamo quei due che sono sul Database_1 e non sul Database_2
I simboli cerchiati di rosso stanno ad indicare che gli oggetti saranno creati nel database di destinazione.
Accendendo alle opzioni di Modifica Mapping noterete che le possibilità di selezione cambiano:
Innanzitutto è ovviamente solo possibile creare la tabella di destinazione. Grazie al pulsante Modifica Codice SQL possiamo cambiare l’istruzione CREATE TABLE corrispondente alla tabella che andiamo a creare. Questa sezione risulta molto utile se vogliamo scriptare anche gli indici, gli identity, le primary key (di default la tabella viene creata solo in base ai campi selezionati nel mapping) e le eventuali foreign key. Ovviamente bisogna fare molta attenzione all’sql che si decide di mettere nell’editor, fra l’altro non dei più comodi.
Poi vi è un nuovo check selezionabile, Elimina e ricrea tabella di destinazione che fornisce lo script DROP & CREATE dell’oggetto finale.
A questo punto, dalla finestra successiva alla fine si ha la medesima procedura di salvataggio, valida per ogni tipologia di operazione.
Copia di dati con l’ausilio di una query ad hoc
Per partire da una query definita dall’utente, l’operazione da scegliere è la seguente:
Questa volta, nella form successiva avremo un editor che si aspetterà l’inserimento di una query di selezione che sarà il datasource del trasferimento dati. Un esempio potrebbe essere quello indicato qui di seguito:
Con il tasto analizza è possibile controllare la sintassi dell’SQL scritto mentre il tasto sfoglia permette l’apertura di un file sql precedentemente creato.
La finestra successiva ripropone il solito elenco di oggetti di cui fare mapping:
Nell’immagine la destinazione è una nuova tabella (denominata genericamente Query) di cui è possibile cambiare lo script di creazione (pulsante Modifica Mapping), ma si può anche scegliere fra gli oggetti già presenti sul database di destinazione. Tramite il tasto anteprima è possibile avere un resoconto delle righe (primi 200 record) che verranno copiate dalla sorgente alla destinazione.
L’anteprima e la selezione fra gli oggetti già disponibili sul database di destinazione vale per ogni tipo di operazione. Anche per le copie di tabelle precedentemente descritti.
Da qui alla fine il procedimento rimane il medesimo.
Ogni qual volta si passa dal mapping degli oggetti, abbiamo due importanti opzioni di cui non ho parlato fino ad ora, Ottimizza per molte tabelle e Esegui in una transazione.
Sono opzioni di importanza rilevante, soprattutto quando si vuole gestire lo spostamento di più oggetti in un solo blocco. A parte l’ottimizzazione del codice per l’inserimento di più tabelle, che rende possibile la parallelizzazione di più operazioni di scrittura, la possibilità di incapsulare tutte le operazioni sotto una sola transazione permette un livello di integrità di dati maggiore, considerando anche che, in caso di errore (vi sono buone probabilità quando non si conoscono gli oggetti di ricevere errori di copia dati per violazione di vincoli) una rollback permette di ritornare allo stato di partenza, in maniera del tutto affidabile.
Conclusioni
Grazie ad import/export wizard è molto semplice copiare anche grandi quantità di oggetti/dati. Come succedeva per SQL Server 2000, anche con 2005 bisogna fare attenzione ad utilizzare questa utility. Ad esempio, non dimenticarsi delle foreign key presenti nel database, che potrebbero impedire alcuni inserimenti al fine di salvaguardare l’integrità.
Inoltre, quando si crea la tabella di destinazione partendo da una già esistente nell’origine, bisogna fare attenzione agli indici, i quali non verranno scriptati (a meno che non indicati in eventuali script di creazione). Quindi, import/export wizard ci aiuta ad eseguire la copia di dati, ci dà anche la possibilità di creare SSIS tramite wizard, evita la scrittura di codice.. ma con i corretti accorgimenti. Il SSIS creato è poi utilizzabile come template, oppure modificabile come meglio lo sviluppatore crede.
In apertura indicavo la possibilità di trasferire dati con l’ausilio di provider differenti da quelli indicati nel tip. Eccone un elenco (cambiano in base alla versione di SQL Server 2005 installata):
Chi già conosce SQL Server 2000 Import/Export Wizard non avrà alcun problema ad adattarsi alla nuova versione su 2005.