Export dat z DB a naslednej import

pp

Export dat z DB a naslednej import
« kdy: 26. 07. 2017, 09:25:40 »
V praci som dostal za ulohu vytvorit appku, ktora spravi export z par DB tabuliek do suboru a nasledne bude robit import do inej tabulky, ale s tym, ze ten import bude podliehat nejakej logike. Myslim ze to bude nieco v zmysle, importuj do tabulky len tie data, ktore sa zhoduju s nejakou uz existujucou hodnotou v danej tabulke. Neviem ci je potreba implementovat nejaku C# konzolovku nato, ale myslim si, ze nieco taketo by islo vyriesit aj cez SQL (T-SQL nakolko vyuzivame MS SQL).


SQL Server Integration Services
« Odpověď #1 kdy: 26. 07. 2017, 10:21:35 »
To musíš zvážit podle druhu operací, které bude třeba s daty dělat. V MS SQL se dá použít: https://docs.microsoft.com/en-us/sql/integration-services/sql-server-integration-services

abc

Re:Export dat z DB a naslednej import
« Odpověď #2 kdy: 26. 07. 2017, 12:04:31 »
Pokud mas MSSQL
pouzij bcp utilitu a bulk insert

Re:Export dat z DB a naslednej import
« Odpověď #3 kdy: 26. 07. 2017, 15:02:00 »
Nestačí prostě něco ve stylu viz níže?

Kód: [Vybrat]
INSERT INTO ... SELECT ... FROM ... WHERE ... ;
IMHO lepší než exportovat a pak importovat. Případně se dají udělat dočasné tabulky a použít další mezikroky:

Kód: [Vybrat]
CREATE TEMPORARY TABLE t1 AS SELECT ... FROM ... WHERE ... ;
-- tady udělat další tabulky, pospojovat, promazat atd. a nakonec:
INSERT INTO ... SELECT ... FROM t1 WHERE ... ;

A vhodně to uzavřít do transakce, aby to byl pod kontrolou stav, pokud se něco nepovede.

pp

Re:Export dat z DB a naslednej import
« Odpověď #4 kdy: 26. 07. 2017, 15:24:32 »
mam taky mensi problem. snazim sa exportovat query do xml suboru.
Kód: [Vybrat]
:XML ON
select ....
FOR XML PATH('Item'), ROOT('Items'), TYPE
toto mam ulozene v skripte a potom cez utilitku sqlcmd robim to, aby mi to vykonalo ten select a rovno ulozilo do xml suboru. problem je, ze ten select vrati strasne vela zaznamov a vysledny XML subor je useknuty na velkosti 1mb. Povodne by mal mat cez 200mb. utilitu bcp (xp_cmdshell nie je povelene)


pp

Re:Export dat z DB a naslednej import
« Odpověď #5 kdy: 26. 07. 2017, 15:29:57 »
resp. z toho query je vytvorene velke XML a sqlcmd to nejak nedokaze ulozit. niekde som sa docital, ze to ma obmedzenie na 1mb.

Re:Export dat z DB a naslednej import
« Odpověď #6 kdy: 27. 07. 2017, 09:18:40 »
Nedrbejte se pravou rukou za levým uchem  :) Udělejte ty operace rovnou v db jak jsem psal, pokud tomu nic nebrání.

Jiri Hovorka

Re:Export dat z DB a naslednej import
« Odpověď #7 kdy: 27. 07. 2017, 14:41:02 »
Na některých db (MSSQL,...) lze udělat i INSERT INTO prvniDb.table(...) SELECT FROM druhaDb.table(...). Odpadá tak nutnost dump/load.

Většina i free nástrojů umí do kopírovat v rámci jednoho výrobce a některé i do určité míry kopírovat mezi db různých výrobců.

Pokud máte dělat kopii dat mezi různými databázemi, v Javě je ideální možnost:
 - otevřít JDBC spojení do db1
 - otevřít JDBC spojení do db2
 - db2.prapareStatement("Insert INTO....")
 - db.open scrollable forward only cursor
   - for i < columnCount
     - db1.ResultSet.getObject(i)
     - preparedStatement.setObject(i)
[předpokládá se úplně stejná struktura]

Velkou výhodou komba getObject/setObject je, že se vůbec nemusíte zalamovat s datovými typy - JDBC drivery udělají vše za vás!
A lze to i vylepšit - program jako argument dostane konfigurační stringy databází + název tabulky a přes metadata si zjistí názvy sloupců, vybuduje si SELECT i INSERT INTO a pak máte absolutní jistotu, že data budou v těch samých sloupcích.
Dá se to všemožně optimalizovat (bulk inserty, granularita,...), ale obvykle toho není třeba.

A takovýto low-level přístup je mnohem lepší v situaci, když musíte řešit zvláštnosti (přemapování dat, konverze codePage, B/CLOBy,...), které s běžnými nástroji nezvládnete. A je to lepší než dělat XML dump-->XSLT-->XML load, protože když už je vaše XSLT vyladěná do maxima, vždycky přijde někdo s požadavkem "a tyhle řádky začínající na xyz chceme zpracovat jinak":-) V kódu si s tím poradíte raz dva, v XSLT to ladíte hodinu.

Hodně štěstí!