SqlCopy 1.0.5

SqlCopy

Aplicatie .NET 9 pentru copierea bazelor de date SQL Server folosind SMO (SQL Server Management Objects).

Caracteristici

  • Doua moduri de lucru:
    • Script-based: Genereaza scripturi SQL cu clasa Scripter, le salveaza local si optional le executa la destinatie
    • Transfer direct: Transfer direct intre servere cu clasa Transfer
  • Obiecte suportate: Tabele, View-uri, Proceduri stocate, Functii, Triggere, Scheme, Tipuri definite de utilizator
  • Filtrare obiecte: Wildcard patterns (*, ?) si expresii regulate
  • Toleranta la erori: Continua transferul chiar daca unele obiecte esueaza
  • Autentificare: Windows Authentication si SQL Server Authentication
  • Interfata CLI: Spectre.Console cu progress bars si output colorat
  • Logging: Serilog cu fisiere log zilnice

Instalare

Cerinte

  • .NET 9 SDK
  • Acces la SQL Server (sursa si/sau destinatie)

Build

git clone <repository-url>
cd sql-copy
dotnet build

Publicare executabil

dotnet publish -c Release -o ./publish

Utilizare

Comenzi disponibile

Comanda Descriere
script Genereaza scripturi SQL din baza de date sursa
transfer Transfer direct catre baza de date destinatie
list Listeaza obiectele din baza de date

Comanda script

Genereaza scripturi SQL pentru toate obiectele din baza de date sursa.

# Generare scripturi (doar local)
sqlcopy script -s "localhost" --source-db "MyDatabase" -o "./scripts"

# Generare scripturi si executie la destinatie
sqlcopy script -s "localhost" --source-db "MyDatabase" -o "./scripts" \
    --execute -d "remote-server" --dest-db "TargetDB"

# Cu SQL Authentication
sqlcopy script -s "localhost" --source-db "MyDatabase" -o "./scripts" \
    --sql-auth -u "sa" -p "password123"

# Fara date (doar schema)
sqlcopy script -s "localhost" --source-db "MyDatabase" -o "./scripts" --no-data

# Cu filtrare
sqlcopy script -s "localhost" --source-db "MyDatabase" -o "./scripts" \
    --exclude "tmp_*" --exclude "log_*" --exclude-regex "^backup_.*"

Optiuni script:

Optiune Descriere Default
-s, --source Server sursa (obligatoriu)
--source-db Baza de date sursa (obligatoriu)
-o, --output Folder output pentru scripturi ./scripts
--execute Executa scripturile la destinatie false
-d, --dest Server destinatie (daca --execute) -
--dest-db Baza de date destinatie -
--no-data Nu genera scripturi pentru date false
--no-indexes Nu genera scripturi pentru indexi false
--no-triggers Nu genera scripturi pentru triggere false
--no-constraints Nu genera scripturi pentru constrangeri false

Comanda transfer

Transfer direct intre doua servere SQL.

# Transfer simplu
sqlcopy transfer -s "localhost" --source-db "MyDatabase" \
    -d "remote-server" --dest-db "TargetDB"

# Creare baza de date destinatie daca nu exista
sqlcopy transfer -s "localhost" --source-db "MyDatabase" \
    -d "remote-server" --dest-db "TargetDB" --create-db

# Stergere obiecte existente la destinatie
sqlcopy transfer -s "localhost" --source-db "MyDatabase" \
    -d "remote-server" --dest-db "TargetDB" --drop-first

# Doar schema, fara date
sqlcopy transfer -s "localhost" --source-db "MyDatabase" \
    -d "remote-server" --dest-db "TargetDB" --no-data

# Cu credentiale diferite pentru destinatie
sqlcopy transfer -s "localhost" --source-db "MyDatabase" \
    -d "remote-server" --dest-db "TargetDB" \
    --sql-auth -u "sa" -p "sourcepass" \
    --dest-user "sa" --dest-password "destpass"

Optiuni transfer:

Optiune Descriere Default
-s, --source Server sursa (obligatoriu)
--source-db Baza de date sursa (obligatoriu)
-d, --dest Server destinatie (obligatoriu)
--dest-db Baza de date destinatie (obligatoriu)
--create-db Creeaza baza de date daca nu exista false
--drop-first Sterge obiectele existente la destinatie false
--batch-size Randuri per batch pentru transfer date 10000
--timeout Timeout bulk copy (secunde) 3600
--no-data Nu transfera datele false
--no-schema Nu transfera schema false
--skip-blob-tables Sari peste coloanele blob pentru tabelele specificate -
--skip-blob-columns Sari peste coloanele blob specificate (doar date) -
--structure-only-tables Transfera doar structura pentru tabelele specificate -
--structure-only-min-rows Transfera doar structura pentru tabele cu randuri peste prag -
--structure-only-min-size Transfera doar structura pentru tabele peste prag (MB) -

Comanda list

Listeaza obiectele din baza de date.

# Toate obiectele
sqlcopy list -s "localhost" --source-db "MyDatabase"

# Doar tabele
sqlcopy list -s "localhost" --source-db "MyDatabase" -t tables

# Doar proceduri
sqlcopy list -s "localhost" --source-db "MyDatabase" -t procedures

# Cu filtru
sqlcopy list -s "localhost" --source-db "MyDatabase" -t tables --filter "*Order*"

Tipuri de obiecte (-t): all, tables, views, procedures, functions, triggers

Optiuni comune

Optiune Descriere Default
--windows-auth Foloseste Windows Authentication true
--sql-auth Foloseste SQL Server Authentication false
-u, --user Username SQL Auth -
-p, --password Parola SQL Auth -
--exclude Pattern wildcard de exclus (poate fi repetat) -
--exclude-regex Pattern regex de exclus (poate fi repetat) -
--include Pattern wildcard de inclus (poate fi repetat) -
--include-regex Pattern regex de inclus (poate fi repetat) -
--continue-on-error Continua la erori true
-v, --verbose Output detaliat false

Filtrare obiecte

Wildcard patterns

  • * - orice secventa de caractere
  • ? - un singur caracter
--exclude "tmp_*"           # Exclude obiectele care incep cu tmp_
--exclude "*_backup"        # Exclude obiectele care se termina cu _backup
--exclude "log_???"         # Exclude log_001, log_abc, etc.
--include "Sales*"          # Include doar obiectele care incep cu Sales

Regex patterns

--exclude-regex "^tmp_.*"           # Exclude obiectele care incep cu tmp_
--exclude-regex ".*_[0-9]{4}$"      # Exclude obiectele care se termina cu 4 cifre
--include-regex "^(Sales|Orders)_"  # Include doar Sales_ si Orders_

Combinare filtre

  • Daca sunt specificate pattern-uri --include, obiectul trebuie sa se potriveasca cel putin unuia
  • Pattern-urile --exclude au prioritate - obiectele excluse nu vor fi procesate
  • Schemele sys si INFORMATION_SCHEMA sunt excluse automat

Structura output scripturi

scripts/
├── Schemas/
│   └── dbo.sql
├── UserDefinedTypes/
│   └── dbo.MyType.sql
├── Tables/
│   ├── dbo.Customers.sql
│   ├── dbo.Orders.sql
│   └── dbo.Products.sql
├── Views/
│   └── dbo.vw_OrderDetails.sql
├── StoredProcedures/
│   ├── dbo.sp_GetCustomer.sql
│   └── dbo.sp_CreateOrder.sql
├── UserDefinedFunctions/
│   └── dbo.fn_CalculateTotal.sql
├── Triggers/
│   └── trg_AuditLog.sql
└── Data/
    ├── dbo.Customers.data.sql
    ├── dbo.Orders.data.sql
    └── dbo.Products.data.sql

Logging

Fisierele log sunt create in folderul logs/ cu format sqlcopy-YYYYMMDD.log.

logs/
├── sqlcopy-20241223.log
├── sqlcopy-20241224.log
└── ...

Exemple avansate

Migrare completa cu filtrare

sqlcopy script \
    -s "production-server" --source-db "ProductionDB" \
    -o "./migration-scripts" \
    --sql-auth -u "readonly_user" -p "password" \
    --exclude "tmp_*" \
    --exclude "log_*" \
    --exclude-regex "^audit_.*" \
    --execute \
    -d "staging-server" --dest-db "StagingDB" \
    --dest-user "admin" --dest-password "adminpass" \
    --continue-on-error \
    -v

Transfer doar tabele specifice

sqlcopy transfer \
    -s "localhost" --source-db "ERP" \
    -d "reporting-server" --dest-db "Reporting" \
    --include "Sales*" \
    --include "Orders*" \
    --include "Customers" \
    --create-db

Backup schema fara date

sqlcopy script \
    -s "localhost" --source-db "MyDB" \
    -o "./schema-backup-$(date +%Y%m%d)" \
    --no-data

Coduri de iesire

Cod Descriere
0 Succes
1 Eroare (partial sau total)

Troubleshooting

Eroare de conexiune

Error: A network-related or instance-specific error occurred

Verificati:

  • Serverul SQL este pornit
  • Firewall permite conexiuni pe portul 1433
  • Numele serverului este corect
  • Credentialele sunt corecte

Eroare de permisiuni

Error: The SELECT permission was denied on object

Utilizatorul trebuie sa aiba cel putin permisiuni db_datareader pentru sursa si db_owner pentru destinatie.

Timeout la transfer date

Mariti timeout-ul:

sqlcopy transfer ... --timeout 7200  # 2 ore

Licenta

MIT License

This package has no dependencies.

Version Downloads Last updated
1.0.13 3 03/11/2026
1.0.12 1 03/11/2026
1.0.11 2 03/11/2026
1.0.10 2 03/11/2026
1.0.9 2 03/11/2026
1.0.8 2 03/11/2026
1.0.7 2 03/11/2026
1.0.6 2 03/11/2026
1.0.5 2 03/11/2026
1.0.4 2 03/10/2026
1.0.3 2 03/10/2026
1.0.2 2 03/10/2026
1.0.1 1 02/19/2026
1.0.0 2 02/19/2026