scripts/win/network/database/export-bacpac.ps1
# ╭─────────────────────────────────────────────╮ # │ 📦 Export SQL Server Database to .bacpac │ # ╰─────────────────────────────────────────────╯ param() Clear-Host # 🧠 Load Borg store $store = Get-Content $storePath | ConvertFrom-Json # 📁 Ensure backup folder exists $backupFolder = $store.CustomFolders.SqlBackupDefault if (-not (Test-Path $backupFolder)) { New-Item -ItemType Directory -Path $backupFolder | Out-Null } # 📋 FZF pick from SqlServers (just names) $nameMap = @{} $store.SqlServers | ForEach-Object { $nameMap[$_.Name] = $_.ConnectionString } $selectedName = $nameMap.Keys | fzf --prompt "Select SQL connection for BACPAC export: " if (-not $selectedName) { Write-Host "❌ No selection made. Aborting." -ForegroundColor Red exit 1 } # 🔍 Get connection string $connString = $nameMap[$selectedName] $builder = [System.Data.SqlClient.SqlConnectionStringBuilder]::new($connString) $dbName = $builder.InitialCatalog $timestamp = Get-Date -Format "yyyyMMdd-HHmmss" $bacpacFile = "${dbName}-${timestamp}.bacpac" $targetPath = Join-Path $backupFolder $bacpacFile # 🛠️ Locate SqlPackage # 🛠️ Locate SqlPackage.exe $sqlPackage = Get-Command "sqlpackage.exe" -ErrorAction SilentlyContinue if (-not $sqlPackage) { $possiblePaths = @( "$env:ProgramFiles\Microsoft SQL Server\*\DAC\bin\SqlPackage.exe", "$env:ProgramFiles(x86)\Microsoft SQL Server\*\DAC\bin\SqlPackage.exe", "C:\ProgramData\chocolatey\lib\sqlpackage\tools\sqlpackage.exe" ) foreach ($path in $possiblePaths) { $resolved = Get-ChildItem -Path $path -ErrorAction SilentlyContinue | Select-Object -First 1 if ($resolved) { $sqlPackage = $resolved.FullName break } } } if (-not $sqlPackage) { Write-Error "❌ SqlPackage.exe not found. Please install SQL Server Data Tools (SSDT) or DacFx." exit 1 } # 🚀 Execute export Write-Host "" Write-Host "📦 Exporting '$dbName' to '$targetPath'..." -ForegroundColor Cyan & $sqlPackage ` /Action:Export ` /SourceConnectionString:$connString ` /TargetFile:$targetPath ` /Quiet # ✅ Report result if (Test-Path $targetPath) { Write-Host "`n✅ Export complete:" -ForegroundColor Green Write-Host " $targetPath" -ForegroundColor Yellow } else { Write-Host "`n❌ Export failed." -ForegroundColor Red } |