Function IsDatabaseExists{ param([string]$containerId, [string]$database, [string]$sqlPass) $query = "IF EXISTS (SELECT name FROM master.sys.databases WHERE name = N'$database') PRINT 'yes' ELSE PRINT 'no'" return (docker exec $containerId /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P $sqlPass -Q $query) # USE master; ALTER DATABASE b-crm-master; SET SINGLE_USER WITH ROLLBACK IMMEDIATE; DROP DATABASE b-crm-master; } Function DropDatabase{ param([string]$containerId, [string]$database, [string]$sqlPass) $query = "USE master; ALTER DATABASE [$database] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; GO DROP DATABASE [$database];" docker exec $containerId /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P $sqlPass -Q $query > $null return; # /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'v](8Lc|RfG' -Q "USE master; ALTER DATABASE b-crm-master; SET SINGLE_USER WITH ROLLBACK IMMEDIATE; DROP DATABASE b-crm-master;" } Function AttachDatabase{ param([string]$containerId, [string]$database, [string]$sqlPass, [string]$mdfName, [string]$ldfName) $query = "CREATE DATABASE [$database] ON (FILENAME = N'/var/opt/mssql/data/$mdfName'), (FILENAME = N'/var/opt/mssql/data/$ldfName') FOR ATTACH; ALTER DATABASE [$database] SET READ_WRITE;" docker exec $containerId /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P $sqlPass -Q $query return; } Function CopyFile{ param([string]$containerId, [string]$fileName) docker cp ./Temp/$fileName $containerId"://var/opt/mssql/data/$fileName" docker exec --user root $containerId chown mssql:root /var/opt/mssql/data/$fileName return; } if ((Split-Path (Get-Location) -Leaf) -ne "DiunaBI") { Write-Host "Error: Run script from main source directory."; Exit; } try { $containerId = (docker ps | Select-String "mssql").Line.split(" ")[0] } catch { Write-Host "Error: MSSQL container not exists (or Docker is not running)"; Exit; } Write-Host "MSSQL container id: "$containerId; $sqlPass = "v](8Lc|RfG"; # Let's do the job! @("diuna").ForEach({ $database = $_; $ldfName = $database+"_log.ldf"; $mdfName = $database+".mdf"; Write-Host "Restoring database: "$database # Download mdf/ldf nd check if files are new (donwload with success) scp "crm.bim-it.pl:/var/opt/mssql/data/$mdfName" ./Temp/ if (((Get-Date) - ((Get-Item ./Temp/$mdfName).LastWriteTime)).TotalMinutes -gt 5) { Write-Host "Error: $mdfName was not downloaded correctly." continue; } scp "crm.bim-it.pl:/var/opt/mssql/data/$ldfName" ./Temp/ if (((Get-Date) - ((Get-Item ./Temp/$ldfName).LastWriteTime)).TotalMinutes -gt 5) { Write-Host "Error: $ldfName was not downloaded correctly." continue; } #drop existing database DropDatabase $containerId $database $sqlPass; if ((IsDatabaseExists $containerId $database $sqlPass) -eq 'yes') { Write-Host "Error: $database still exists (drop error)" continue; } #copy new files CopyFile $containerId $mdfName CopyFile $containerId $ldfName #attach databases in container AttachDatabase $containerId $database $sqlPass $mdfName $ldfName; if ((IsDatabaseExists $containerId $database $sqlPass) -eq 'no') { Write-Host "Error: $database still not exists (attach error)" continue; } Write-Host "OK"; }); Write-Host "All databases restored!";