DR HACK

Davide Rosa Hack

DumpSQL

DumpSQL

DumpSQL icon

Console application .NET 8 / C# per estrarre dati da un database MSSQL o MySQLe generare file .sql pronti all'uso con sintassi upsert, destinati al trasporto verso ambienti di debug o staging.


Funzionamento

Per ogni tabella configurata, DumpSQL esegue:

SELECT * FROM <tabella> WHERE <campo_riferimento> > <valore_riferimento>

e genera un file <tabella>_<data>.sql in streaming con istruzioni upsert:

La clausola ON del MERGE (o la chiave dell'upsert MySQL) viene costruita a partire dal campo KeyColumns di ciascuna tabella. Se KeyColumns è vuoto, viene usata la prima colonna del resultset come fallback.


Download

I binari precompilati sono disponibili nella pagina Releases per tutte le piattaforme supportate:

Ogni pacchetto è self-contained: non richiede .NET installato sulla macchina.
Estrarre lo zip, editare appsettings.json con la propria stringa di connessione ed eseguire il binario.


Requisiti

Per usare i binari precompilati:

  • Nessuna dipendenza — i pacchetti sono self-contained

Per compilare dal sorgente:

In entrambi i casi:

  • Accesso a un server MSSQL (SQL Server) o MySQL

Installazione

git clone <url-repository>
cd DumpSQL
dotnet restore src/DumpSQL/DumpSQL.csproj

Configurazione

Il file di configurazione predefinito è appsettings.json nella directory di lavoro.
È possibile fornire un file alternativo dalla riga di comando (vedi sezione Utilizzo).

{
  "DatabaseType": "mssql",
  "ConnectionString": "Server=localhost;Database=MyDatabase;User Id=sa;Password=YourPassword;TrustServerCertificate=True;",
  "OutputDirectory": "output",
  "Tables": [
    {
      "TableName": "dbo.Customers",
      "ReferenceField": "UpdatedAt",
      "ReferenceValue": "2024-01-01",
      "KeyColumns": [ "Id" ]
    },
    {
      "TableName": "dbo.OrderLines",
      "ReferenceField": "OrderDate",
      "ReferenceValue": "2024-01-01",
      "KeyColumns": [ "OrderId", "LineId" ]
    }
  ]
}

Parametri

Esempi di ConnectionString

MSSQL – autenticazione SQL:

Server=localhost;Database=MyDb;User Id=sa;Password=secret;TrustServerCertificate=True;

MSSQL – autenticazione Windows:

Server=localhost;Database=MyDb;Integrated Security=True;TrustServerCertificate=True;

MySQL:

Server=localhost;Port=3306;Database=MyDb;Uid=root;Pwd=secret;

Utilizzo

# File di configurazione predefinito (appsettings.json)
dotnet run --project src/DumpSQL/DumpSQL.csproj

# File di configurazione alternativo (flag --config)
dotnet run --project src/DumpSQL/DumpSQL.csproj -- --config appsettings-mysql.json

# Argomento posizionale (equivalente)
dotnet run --project src/DumpSQL/DumpSQL.csproj -- /percorso/config.json

# Build + eseguibile
dotnet publish src/DumpSQL/DumpSQL.csproj -c Release -o ./publish
./publish/DumpSQL.exe --config appsettings-mysql.json

Interruzione

Premere Ctrl+C per interrompere il dump in modo pulito. I file parziali vengono eliminati automaticamente.

Output

I file vengono creati nella cartella OutputDirectory con il formato <tabella>_<yyyyMMdd>.sql:

output/
├── dbo_Customers_20260422.sql
└── dbo_OrderLines_20260422.sql

Esempio di contenuto MSSQL (con schema e chiave composita):

-- Dump generato il 2026-04-22 10:30:00 -- Tabella: dbo.Customers

MERGE INTO [dbo].[Customers] AS target
USING (VALUES (1, 'Mario Rossi', '2026-01-15 08:00:00')) AS source ([Id], [Name], [UpdatedAt])
ON target.[Id] = source.[Id]
WHEN MATCHED THEN
    UPDATE SET target.[Name] = source.[Name], target.[UpdatedAt] = source.[UpdatedAt]
WHEN NOT MATCHED THEN
    INSERT ([Id], [Name], [UpdatedAt]) VALUES (1, 'Mario Rossi', '2026-01-15 08:00:00');

Esempio di contenuto MySQL (batch upsert):

-- Dump generato il 2026-04-22 10:30:00 -- Tabella: orders

INSERT INTO `orders` (`id`, `customer_id`, `total`)
VALUES (1, 42, 99.90),
       (2, 43, 150.00)
ON DUPLICATE KEY UPDATE `total` = VALUES(`total`);

RestoreSQL

RestoreSQL è il complemento di DumpSQL: legge i file .sql generati e li applica su un database target tramite upsert.

Utilizzo

# File di configurazione predefinito (appsettings.json)
dotnet run --project src/RestoreSQL/RestoreSQL.csproj

# File di configurazione alternativo
dotnet run --project src/RestoreSQL/RestoreSQL.csproj -- --config appsettings-mysql.json

# Build + eseguibile
dotnet publish src/RestoreSQL/RestoreSQL.csproj -c Release -o ./publish
./publish/RestoreSQL.exe --config appsettings-mysql.json

Configurazione

{
  "DatabaseType": "mssql",
  "ConnectionString": "Server=localhost;Database=MyDb;User Id=sa;Password=secret;TrustServerCertificate=True;",
  "InputDirectory": "input",
  "TableOrder": [
    "THIP_REPARTI",
    "THIP_FORNITORI",
    "THIP_ARTICOLI",
    "THIP_ART_VERSIONI",
    "THIP_ARTICOLI_CLI"
  ]
}

Comportamento

  • Esegue tutti i file .sql presenti in InputDirectory nell'ordine definito da TableOrder, poi i restanti in ordine alfabetico
  • Ogni file viene applicato in una transazione: se un'istruzione fallisce, il file viene annullato (rollback) e si continua con il successivo
  • I file generati da DumpSQL sono già in sintassi upsert (MERGE / INSERT ON DUPLICATE KEY UPDATE)
  • In caso di errori, il processo esce con codice 2 (utile per script CI/CD)

Log

I log vengono scritti su console e nella cartella log/ con un file per giorno:

log/
└── 20260422.log

All'avvio, i file di log più vecchi di 30 giorni vengono eliminati automaticamente.

Modalità Debug: all'avvio in configurazione Debug, la cartella log/ viene svuotata automaticamente. Per DumpSQL viene svuotata anche output/.


Struttura del progetto

DumpSQL/
├── src/
│   ├── DumpSQL/
│   │   ├── Program.cs
│   │   ├── appsettings.json              # configurazione MSSQL (THIP, 14 tabelle)
│   │   ├── appsettings-mysql.json        # configurazione MySQL (matrixintranet, 9 tabelle)
│   │   ├── appsettings-biemmedb.json     # configurazione MySQL (biemmedb MES, 83 tabelle)
│   │   ├── Models/
│   │   │   ├── AppSettings.cs
│   │   │   └── TableConfig.cs
│   │   └── Services/
│   │       ├── IDatabaseService.cs
│   │       ├── MssqlDatabaseService.cs
│   │       ├── MysqlDatabaseService.cs
│   │       ├── SqlFileGenerator.cs
│   │       ├── SqlQuoting.cs
│   │       └── LogCleanupService.cs
│   └── RestoreSQL/
│       ├── Program.cs
│       ├── appsettings.json              # configurazione MSSQL target
│       ├── appsettings-mysql.json        # configurazione MySQL target (biemmedb)
│       ├── Models/
│       │   └── AppSettings.cs
│       └── Services/
│           └── RestoreService.cs
└── DumpSQL.slnx

Dipendenze NuGet

Apri il progetto su GitHub

Per il codice sorgente e gli altri progetti visita il profilo GitHub di rsodvd79 .