Um die Daten einer MS-SQL Datenbank zu exportieren und anschließend in die geDockerte Version zu kopieren (MS-SQL DB in Docker Container) habe ich die Chains verwendet, eine propritäre Software.
Vorbereitung
Die Entwicklung und Ausführung der Scripte erfolgt auf dem Entwickler Laptop. Später werden die Scripte voraussichtlich auf den Servern ausgeführt, da grade für die produktive Umgebung eine längere Laufzeit erwartet wird.
Auf den Entwickler Laptops läuft Windows, so dass zum Ausführen der Chains das Windows Executable Chain.cmd verwendet wird. In dieser Datei sind Anpassungen vorzunehmen, so ist der JAVA_HOME Pfad inzwischen ein anderer und mMn sollte das File Encoding auf UTF-8 gesetzt werden:
#SET JAVA_HOME=%~d0/jre13 SET JAVA_HOME=%~c0/eclipse/java/java1.8 SET FIXED_PROPS=%STDPROPS% [...] -Dfile.encoding=UTF-8
Die Ausführung der einzelnen Chain muss aus dem Verzeichnis der Chain.cmd erfolgen.
Ausnahme: Auf meinem Laptop muss ich es genau anders herum machen und in das Verzeichnis der Chain gehen und Chain.cmd mit absolutem Pfad aufrufen.
cd D:\Development\workspace\chainproject\bin\ Chain.cmd ../../ChainsProject/ImportChain.chn
Datenbank Verbindungsdaten
Die Verbindungsdaten der Datenbank werden in einer eigenen Konfigurationsdatei hinterlegt:
# connection: .db=jdbc:jtds:sqlserver://localhost:1433/CCP;TDS=8.0 .user=DonaldDemo .password=DonaldDemo12345678 # DBObjectSQLServer options: .objects.autorestore=false .autorollback=false .maxconnects=1 .initialconnects=1 # DBObjectSQLServerScript options: .sqlecho=INFO
Export Chain
Das Chain Command Script ist relativ übersichtlich, da lediglich ein Schritt ausgeführt werden muss. Für diesen Schritt ist das Prefix und die zu verwendende Java Klasse zu definieren. Außerdem sind noch die Verbindungsdaten der Datenbank zu includieren:
# chainmanager.process-1.prefix=dbscr dbscr.chain.class=package.name.db.DBObjectSQLServerScript # # Scripts: dbscr.script1=ExportChain.sql # include configuration: dbscr.chain.include=MSSQL-RealServer-Connect.inc
Das Chain "SQL" Script ermittelt erst alle Tabellen der angegebenen Schema und speichert diese in der Datei TABLES.csv:
#DEFINE CSVFILE TABLES.csv #QUERY_CSV (ECHO) [CSVFILE] SELECT table_catalog, table_schema, table_name, table_type FROM CCP.INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA IN ('DEMO_SCHEMA') ORDER BY TABLE_SCHEMA, TABLE_NAME #INFO [SELECTED] rows exported into File [CSVFILE]
Anschließend wird über alle Tabellen iteriert, deren Daten gelesen und in einer CSV-Datei gespeichert:
#FOREACH IDX [CSVFILE] #INFO Start export of: [IDX:table_schema] [IDX:table_name] #DEFINE CSVFILE_TABLE [IDX:table_schema]/[IDX:table_name].csv #QUERY_CSV (ECHO) [CSVFILE_TABLE] SELECT * FROM [IDX:table_schema].[IDX:table_name] #INFO [SELECTED] rows exported into File [CSVFILE_TABLE] #NEXT IDX
Import Chain
Das Chain Command Script entpricht weitgehend dem Export Script:
# chainmanager.process-1.prefix=dbscr dbscr.chain.class=package.name.db.DBObjectSQLServerScript # # Scripts: dbscr.script1=ImportChain.sql # include configuration: dbscr.chain.include=MSSQL-DockerServer-Connect.inc
Als Vorbereitung muss im Verzeichnis DEMO_SCHEMA eine Datei csvlist angelegt werden, in dieser stehen die zu importierenden Tabellendaten-CSV-Dateinamen. Der reine Import ist ein Einzeiler, dem diese csvlist Datei übergeben wird und das Schema, in das diese Tabellendaten importiert werden sollen:
#IMPORT_CSV_DIR (ECHO) (ENCODING=UTF-8) (ERRORLOG) *DEMO_SCHEMA/csvlist DEMO_SCHEMA
Das ganze Script benötigt noch weitere Befehle, Details dazu siehe MS-SQL DB in Docker Container:
#INFO #INFO [PROCESS] start... #INFO DBUser: [DBUSER] // Database-URL: [DBURL] -- disable all constraints EXEC sp_MSforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all" -- SET IDENTITY_INSERT ccp_fdt.performance ON #IMPORT_CSV_DIR (ECHO) (ENCODING=UTF-8) (ERRORLOG) *DEMO_SCHEMA/csvlist DEMO_SCHEMA -- enable all constraints exec sp_MSforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"