From 2784c3ed7ee8742428b279b0d2f753da6330f355 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Zieli=C5=84ski?= Date: Thu, 5 Jan 2023 19:13:06 +0100 Subject: [PATCH] Create loadStagingDB.ps1 --- Utils/loadStagingDB.ps1 | 88 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 Utils/loadStagingDB.ps1 diff --git a/Utils/loadStagingDB.ps1 b/Utils/loadStagingDB.ps1 new file mode 100644 index 0000000..7b313d1 --- /dev/null +++ b/Utils/loadStagingDB.ps1 @@ -0,0 +1,88 @@ +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!"; \ No newline at end of file