Databasfråga - Hur skapa stort "Insert"-script?

korvgubbe

Ny medlem
Gick med
13 May 2003
Ort
Sthlm
Hoj
Versys -08
Jag har tre databaser.
1. Produktion
2. Kopia på produktion
3. Kopia på gammal produktionsDB

I nuvarande produktion finns saknas det en del poster i en given tabell.
Genom att jämföra innehållet i 2 & 3vill jag alltså ta ut de saknade posterna.
Av detta urval vill jag på enklaste sätt skapa ett SQL-Script med en massa inserts som jag sedan kan köra mot produktion(db 1) då jag inte har möjlighet att jobba direkt mot denna databas. Jag måste alltså skapa ett skript som hostingföretaget får köra mot denna databas...

Hur skapar jag enklast en stor djävla fil med inserts?

Finns det något smidigt sätt att göra det i SQL Server?
 
Måste du ha just de saknade posterna, går det inte att ersätta hela tabellen med kopian?

Nepp, hade det varit så enkelt hade jag varit glad.

Tyvärr har lite olika samverkande faktorer lett till att poster som borde finnas i drift inte finns där samtidigt som vissa poster inte borde finnas där alls. Efter insert-skriptet skall jag göra likadant för att ta bort x antal poster.

Förenklat kan man säga att de två databaserna under en period existerade parallellt istället för att den nuvarande ersatte den gamla vid ett givet tillfälle.
 
Skulle det gå att köra in allt innehåll från tabellen från db2 och db3 till tabellen i db1?
Förutsatt att det finns en primary key som inte kan dupliceras så skapas det ju inga dubletter.
 
Skulle det gå att köra in allt innehåll från tabellen från db2 och db3 till tabellen i db1?
Förutsatt att det finns en primary key som inte kan dupliceras så skapas det ju inga dubletter.

Jag kommer få skapa nya ID'n för posterna som skall läsas in men det går alltid att lösa med att plussa en miljon eller något på ID:t...
 
Missförstå mig rätt! :)

Om du bara dumpar över tabellerna så slipper du ju automatiskt dubletter och får in allt från alla tre databaserna i en? Och det är väl vad du vill?
 
Missförstå mig rätt! :)

Om du bara dumpar över tabellerna så slipper du ju automatiskt dubletter och får in allt från alla tre databaserna i en? Och det är väl vad du vill?

Ah, du tänkte så. Tyvärr är det inte så enkelt. Vid något tillfälle har någon annan försökt rätta upp innehållet och då läst in "saknade poster". Dessa har då fått nya ID'n så det finns inte längre någon konsistens i ID:na i den nya databasen jämfört med den gamla databasen.
 
Om det är mysql så föreslår jag att du går till väga i stora steg:

- Ta en mysqldump av enbart aktuell tabell på varje databas.

- Ändra i mysqldumpfilen så tabellnamnet blir tex tabell1, tabell2 och tabell3 beroende på vilken av de tre mysqldumparna det är.

- Återläs dessa tre nya tabeller på valfri databasserver.

- Gör urvalet till en fjärde tabell4.

- Kopiera över tabellen till produktion med mysqldump, renamea originaltabellen och sedan den kopierade så har du en backup kvar om du skulle gjort fel i steget innan.


Vill du ha hjälp med urvalssteget så kan du hojta till när du kommit dit :tummenupp


Edit: Ser svaret nu, men det borde gå att göra samma steg i SQL Server fast med annat kommando än mysqldump?

Edit2: Eller så återskapar du alla tabellerna till en stor tabell med en ny primary key (du behåller gamla nyckeln fast det är inte längre en unique identifier) och sedan gör du en insert till ny tabell med select distinct som källa.
 
Last edited:
Om det är mysql så föreslår jag att du går till väga i stora steg:

- Ta en mysqldump av enbart aktuell tabell på varje databas.

- Återläs dessa tre nya tabeller på valfri databasserver.

Vi har lite dependencies i prod som gör att jag inte kan ändra några ID'n på den sidan...
 
Beror ju lite på hur mycket data det är, men har du ingen möjlighet att direkt överföra data med en fråga som spänner över flera servrar/databaser, skulle jag skriva en fråga som är något i stil med ett script som skriver ett skript där varje rad är en insert.

Alltså något i stil med

Select 'Insert into targetTable Select ' + st.a +',' + st.b + ',''' + st.c +''',' + st.c
from sourceTable st

Kopiera outputen till en fil och kör den i produktionsdatabasen, till en staging-tabell för att sedan skriva ytterligare ett script för att fixa till id:n och undvika dubletter.

Alternativt så kan ju din databas ha andra mekanismer för att exportera/importera data.

Poängen är att skapa en stagingtabell för data som du vill ha in och sedan använda den för att göra dina manipulationer lokalt i produktionsdatabasen.
 
Ahh det är klart ( /facepalm på mig själv).

Gör samma steg men ta bort allt från tabell1 ur tabell4 och kopiera över allt från tabell4 till orginaltabellen?

Jag har en hyffsad idé om hur jag skall välja ut det jag skall importera till driftsdatabasen...

Min egentliga fråga är hur jag lättast skapar skriptet rent praktiskt. Alltså hur gör jag enklast föratt förvandla min select *-fråga till en textfil med en "insert"-rad per post från min nyss ställda select-sats....
 
Beror ju lite på hur mycket data det är, men har du ingen möjlighet att direkt överföra data med en fråga som spänner över flera servrar/databaser, skulle jag skriva en fråga som är något i stil med ett script som skriver ett skript där varje rad är en insert.

Alltså något i stil med

Select 'Insert into targetTable Select ' + st.a +',' + st.b + ',''' + st.c +''',' + st.c
from sourceTable st

.

jag börjar misstänka att det är enklaste lösningen..
 
Jag har en hyffsad idé om hur jag skall välja ut det jag skall importera till driftsdatabasen...

Min egentliga fråga är hur jag lättast skapar skriptet rent praktiskt. Alltså hur gör jag enklast föratt förvandla min select *-fråga till en textfil med en "insert"-rad per post från min nyss ställda select-sats....

Jaha, men då är det ju lätt! Gör som bivius föreslår :tummenupp
 
Jo, det lär bli så, bara sån orgie i plustecken och enkelfnuttar...

Med risk för att bli lynchad brukar jag lösa sånt på ett annat sätt.

Ut med resultatet i en textfil, importera till excel
Sen sätter man fält emellan med select-text, fnuttar och kommatecken och vad som nu kan behövas. Och bara kopierar.

Fult men det gör jobbet.
 
Med risk för att bli lynchad brukar jag lösa sånt på ett annat sätt.

Ut med resultatet i en textfil, importera till excel
Sen sätter man fält emellan med select-text, fnuttar och kommatecken och vad som nu kan behövas. Och bara kopierar.

Fult men det gör jobbet.

Har gjort på så jag med vid ett par tillfällen
 
Nyheter
Premiär för Östgöta Dundret

Under 1940 talet var Finspå...

Ny 500-kubiks retro från Honda

Efter rykten om en ny retro...

Ny 500-kubiks retro från Honda

Efter rykten om en ny retro...

Ny 500-kubiks retro från Honda

Efter rykten om en ny retro...

Nya BMW S 1000 RR tar form

Redan i maj 2025 gav BMW me...

Helsvarta Deadwood – Ny cruiser från H-D

H-D presenterar nya Deadwoo...

Sommarauktion hos Antiqueweb

Svenska Antiqueweb avslutar...

HJC stärker kundrelationen

Pressrelease från HJC Helme...

Sportsterbygge i nästa nummer

I Allt om MC nummer 8 komme...

Dags för gräsgasa hos Hydet

Den 1 augusti kör Hydet MC ...

Back
Top