Declassamento da SQL Server 2008 a 2005


32

I file di database creati utilizzando SQL 2008 non sono compatibili con il 2005. Esistono soluzioni?


Non dimenticare di esportare anche gli accessi al server.
StanleyJohns,

Questo perché stai sviluppando nel 2008 ma i tuoi server di produzione sono ancora nel 2005? Qualsiasi soluzione che fornirai ritarderà l'inevitabile e allo stesso tempo renderà la tua vita miserabile, poiché probabilmente finirai per fare questi downgrade su base regolare.
datagod

Risposte:


16

Non sono necessari strumenti di terze parti. SQL Server 2008 Management Studio ci ha fornito uno strumento molto potente per convertire verso il basso un database perché hanno aggiunto un'opzione "Dati script" alla procedura guidata "Database script".

Fai clic con il pulsante destro del mouse sul DB in SQL2008 SSMS e vai su Attività, quindi "Genera script"

Segui la procedura guidata, assicurati di scegliere "Vero" per "Dati script" sotto le opzioni tabella / vista. Scegli tutti gli oggetti, quindi esegui lo script che crea sul server 2005. (Tieni presente che lo script creato potrebbe essere enorme se il database originale è molto grande!)

Nota che puoi persino eseguire la procedura guidata su un server SQL2005 per convertire un database SQL2005 in SQL2000 (ovviamente, avrai bisogno degli strumenti 2008 installati sulla tua workstation).


4
Senza offesa, ma questa non può essere una soluzione se il database è grande. Prova quella tecnica su qualsiasi tabella con pochi milioni di righe (e pensa a varchar (max) come il tipo di dati di una singola colonna) e se Management Studio sarà in grado di aprire e analizzare questo file sarai contento, ma io sono certo che non si aprirà, andrà in crash. Siamo spiacenti, ma questa non è la soluzione a questo problema, tranne se il db è davvero piccolo.
Marian,

3
Certo, se il db è troppo grande, esegui lo scripting solo della struttura del database, quindi usa il tuo metodo preferito (SSIS, BCP, Import Wizard) per inviare i dati.
BradC,

In SSMS 11.0 non sembra esserci alcuna opzione per lo script dei dati insieme alla struttura. i.imgur.com/SGkG8oZ.png
jcollum

Ah OK ora è sotto "Tipi di dati da script" appena sopra la Tabella / Visualizza opzioni
jcollum

16

È possibile BCP i dati da un'istanza di SQL Server a un'altra istanza. Sarebbe il modo più veloce per copiare i dati da una versione all'altra. A seconda del volume di dati, potrebbe richiedere molto tempo.


2
A seconda del volume di dati, ci vorrà quasi sempre molto tempo
jcolebrand

Sì, lo farà sicuramente. Spostare un database di grandi dimensioni in una versione precedente di SQL Server non è un compito facile.
mrdenny,

2
Il vantaggio di BCP è che sarà più veloce dell'uso dei dati degli script. Sì, è lento, ma è più veloce di molte alternative.
Jeremiah Peschka,

15

Sfortunatamente non esiste un modo diretto per il downgrade di un DB dal formato 2008 a quello del 2005.

Il modo in cui l'ho fatto in passato (in realtà con versioni precedenti di SQL Server, ma il processo sarà lo stesso) è:

  1. Ripristinare il DB su un'istanza SQL2008 se non già fatto
  2. Crea un DB vuoto con le strutture corrette (tabelle, indici, vincoli, viste, proc, trigger, ...) su un'istanza SQL2005. Si spera che sia possibile farlo dalla propria procedura di compilazione e / o codice sorgente esistente, ma in caso contrario è possibile utilizzare SQL Server Manager per creare script per tutto nel DB 2005 ed eseguire il risultato su uno vuoto nell'istanza 2008.
  3. Assicurati che le due istanze possano vedersi (ovvero che non ci siano firewall che bloccano le connessioni se le istanze si trovano su macchine diverse) e collegale usando sp_addlinkedserver .
  4. Copia tutti i dati da un DB all'altro. Se non ci sono vincoli di chiave esterna e problemi simili nei trigger di cui preoccuparsi, puoi semplicemente collegare insieme i DB e scorrere l'elenco delle tabelle (selezionandoli da sys.objects) e in esecuzione
    INSERT destinationserver.destinationdb.schema.table SELECT * FROM sourcedb.schema.table
    (o INSERT schema.table SELECT * FROM sourceserver.sourcedb.schema.tablese hai collegato le istanze in questo modo )
    per ogni tavolo. Se hai coerenza tra tabelle che impone vincoli e trigger, dovrai ovviamente essere un po 'più intelligente sull'ordinamento di queste operazioni, specialmente se hai vincoli ciclici come una tabella con un vincolo basato su se stesso (una gerarchia di mantenimento dati, come possibile esempio).

Potrebbe essere più efficiente copiare prima i dati e aggiungere tutte le altre strutture (indici, processi, trigger, ...) dopo il passaggio 3. In questo modo si evitano i problemi di ordinamento dell'inserimento di righe causati da vincoli e trigger e la creazione di indici end dovrebbe in teoria essere più veloce della loro creazione poiché tutti i dati vengono aggiunti, anche se se si dispone di indici cluster sulle tabelle, crearli prima di aggiungere i dati poiché non sarebbero più veloci da creare dopo il fatto.

Ovviamente tutto ciò presuppone che nessuno dei tuoi oggetti utilizzi funzionalità specifiche di SQL 2008 - se lo fanno, spero che scoprirai e risolverai tali cose quando si verificano errori durante la ricostruzione dello schema. Se uno qualsiasi dei tuoi codici si basa su un comportamento ufficialmente indefinito che sembra essere variato tra le versioni di SQL Server, potresti avere alcuni bug molto più sottili ed elusivi da cercare e risolvere in seguito.


1
-1 perché questo è effettivamente inefficiente (seleziona * in da) rispetto a simili a BCP.
jcolebrand

@jcolebrand abbastanza onesto sull'efficienza. Sebbene la tecnica sia quella su cui ho lavorato.
David Spillett,

è un sistema equo, ho solo pensato di includerlo a causa dei futuri lettori qui. Al momento hai i voti per non essere un problema. ;)
jcolebrand


1

Devi prima eseguire lo script del database e assicurarti che sulla versione specifichi il tipo a cui desideri effettuare il downgrade. E per copiare i dati dalla versione superiore alla versione inferiore, il confronto dei dati SQL ti farà il trucco per te.

In bocca al lupo!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.