Gegevensmigratie met verschillende schema's

Ik heb een database DBv1 op een SQL Server en ik wil de gegevens erin migreren naar DBv2 (in dezelfde box, server opslaan). DBv2 heeft een vergelijkbaar schema. Het enige verschil in schema is dat DBv2 één tabel minder heeft, omdat deze de-genormaliseerd is.

Wat zou de meest praktische manier zijn om de gegevens van DBv1 naar DBv2 te migreren vanwege die wijziging in het schema en de noodzaak van enige transformatie?

Is er een tool die dat voor mij zou doen? Of moet ik dat handmatig manueel schrijven?

Ter verduidelijking: dit is slechts een eenmalige belasting omdat het slechts een migratie is. Op schema hier verwijs ik niet naar het SQL-object met dezelfde naam. Integendeel, ik verwijs naar de structuur van de tabellen. Vanwege de de-normalisatie wordt één tabel verwijderd en wordt een nieuwe kolom toegevoegd aan de bovenliggende tabel met de gegevens in de verwijderde tabel.

3
ja ru de
Aangezien u niet eenvoudigweg kunt herstellen via DBv2, zal het antwoord enigszins worden beïnvloed, afhankelijk van of dit een eenmalige of een terugkerende update zal zijn (Opmerking: volledig opnieuw laden kan als een eenmalige belasting worden beschouwd). -time load, een SSIS-pakket is waarschijnlijk het gemakkelijkst om te doen. Kopieer één voor één voor alle identieke tabellen (vergeet niet Identiteitsinvoeging in te schakelen), gebruik vervolgens een query die de gewenste informatie genereert in de ene nieuwe tabel uit de twee oude tabellen als bron en upload die in de nieuwe trable.
toegevoegd de auteur Offirmo, de bron

4 antwoord

U kunt bcp out en bulk invoegen gebruiken om te bereiken wat u probeert te doen.

U kunt mijn script gebruiken

Maak lokaal een map D: \ BCP_OUT \ op de server waar de bcp out-bestanden zich zullen bevinden.

/************************************************************************************************************************************************
Author      :   KIN SHAH    *********************************************************************************************************************
Purpose     :   Move data from one server to another or from one db to another *********************************************************************************************
DATE        :   05-28-2013  *********************************************************************************************************************
Version     :   1.0.0   *************************************************************************************************************************
RDBMS       :   MS SQL Server 2008R2 and 2012 & up  *************************************************************************************************
*************************************************************************************************************************************************/

-- save below output in a bat file by executing below in SSMS in TEXT mode. Review the OUTPUT and run the .bat file. This will create the bcp out files with data in them.
-- clean up: create a bat file with this command --> del D:\BCP_OUT\*.dat 

select '"C:\Program Files\Microsoft SQL Server\100\Tools\Binn\bcp.exe" '-- path to BCP.exe
        +  QUOTENAME(DB_NAME())+ '.'                                    -- Current Database
        +  QUOTENAME(SCHEMA_NAME(SCHEMA_ID))+'.'            
        +  QUOTENAME(name)  
        +  ' out D:\BCP_OUT\'                                           -- Path where BCP out files will be stored
        +  REPLACE(SCHEMA_NAME(schema_id),' ','') + '_' 
        +  REPLACE(name,' ','') 
        + '.dat -T -E -SSERVERNAME\INSTANCE -n'                         -- ServerName, -E will take care of Identity, -n is for Native Format
from sys.tables
where is_ms_shipped = 0 and name <> 'sysdiagrams'                       -- sysdiagrams is classified my MS as UserTable and we dont want it
and schema_name(schema_id) <> 'some_schema_exclude'                     -- Optional to exclude any schema 
order by schema_name(schema_id)                         



--- Execute this on the destination server.database from SSMS.
--- Make sure the change the @Destdbname and the bcp out path as per your environment.

declare @Destdbname sysname
set @Destdbname = 'destination_database_Name'               -- Destination Database Name where you want to Bulk Insert in
select 'BULK INSERT '                                       -- Remember Tables **must** be present on destination Database
        +  QUOTENAME(@Destdbname)+ '.'
        +  QUOTENAME(SCHEMA_NAME(SCHEMA_ID))+'.' 
        +  QUOTENAME(name) 
        + ' from ''D:\BCP_OUT\'                             -- Change here for bcp out path
        +  REPLACE(SCHEMA_NAME(schema_id),' ','') + '_'
        +  REPLACE(name,' ','') 
        +'.dat'' 
        with (
        KEEPIDENTITY,
        DATAFILETYPE = ''native'',  
        TABLOCK
        )'  + char(10) 
        + 'print ''Bulk insert for '+REPLACE(SCHEMA_NAME(schema_id),' ','') + '_'+  REPLACE(name,' ','')+' is done... '''+ char(10)+'go' 
from sys.tables
where is_ms_shipped = 0 and name <> 'sysdiagrams'           -- sysdiagrams is classified my MS as UserTable and we dont want it
and schema_name(schema_id) <> 'some_schema_exclude'         -- Optional to exclude any schema 
order by schema_name(schema_id)
3
toegevoegd

You can use Import/Export in the SSMS for transferring data (right-click a database in Object Explorer -> Tasks -> Import Data.../Export Data ...) - pick SQL connection to DBv1 as a source and DBv2 as a destination and select objects to be transferred along with mapping in the next steps.

Hier is de tutorial importeren/exporteren door Ray Barley

Voor waar u een verschil in het schema hebt, kunt u proberen een weergave te maken die in de brontabel op basis van uw nieuwe bestemming in de DBv2 en in het dialoogvenster Importeren/exporteren zou vertalen naar de betreffende objecten in de bestemming.

1
toegevoegd

Misschien is de eenvoudigste methode om dit te doen, het herstellen van een kopie van DBv1 als DBv2 , en vervolgens de tabel te wijzigen die moet worden bewaard door een kolom toe te voegen en vervolgens de gegevens te kopiëren van de tabel die in de nieuwe kolom moet worden geplaatst.

Bijvoorbeeld, zoiets als dit:

CREATE TABLE dbo.retain
(
    retain_id int NOT NULL
        PRIMARY KEY CLUSTERED
    ...cols...
);

CREATE TABLE dbo.to_be_dropped
(
    to_be_dropped int NOT NULL
        PRIMARY KEY CLUSTERED
    , retain_id int NOT NULL
        FOREIGN KEY 
        REFERENCES dbo.retain(retain_id)
    , someData varchar(30) NOT NULL
);

ALTER TABLE dbo.retain
ADD someData varchar(30) NOT NULL;

UPDATE dbo.retain
SET someData = tbd.someData
FROM dbo.retain r
    INNER JOIN dbo.to_be_dropped tbd ON r.retain_id = tbd.retain_id;

Nadat u hebt vastgesteld dat de gegevens correct zijn gekopieerd, plaatst u eenvoudig de onnodige tabel:

DROP TABLE dbo.to_be_dropped;
0
toegevoegd

Bedankt aan @Kin voor het verwijzen naar de bcp-tool. Ik kon mijn probleem oplossen met bcp.

De manier om dat voor mij te doen, was door de gegevens te exporteren als een zoekopdracht om mee te doen

bcp "select A.column1, B.column2 from A join B on A.BId = B.Id" queryout C:\temp\AJoinB.dat -n -S serverHostName -T

Dan

bcp MyNewTable in C:\temp\AJoinB.dat -n -S serverHostName -T

En dat deed het.

0
toegevoegd