Files
DiunaBI/Utils/loadStagingDB.ps1
2023-02-22 12:12:38 +01:00

88 lines
3.6 KiB
PowerShell

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!";