From 28b31d006080d2f7c14673fc948a80acb322a7bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alan=20P=C5=82=C3=B3cieniak?= Date: Sun, 11 Oct 2020 14:13:56 +0200 Subject: [PATCH] sql scripts --- sql/convert-dacpac-to-mdf.ps1 | 78 ++++++++++++++++++++++++++++++++ sql/create-db-from-dacpac.ps1 | 83 +++++++++++++++++++++++++++++++++++ 2 files changed, 161 insertions(+) create mode 100644 sql/convert-dacpac-to-mdf.ps1 create mode 100644 sql/create-db-from-dacpac.ps1 diff --git a/sql/convert-dacpac-to-mdf.ps1 b/sql/convert-dacpac-to-mdf.ps1 new file mode 100644 index 0000000..ca7cfb8 --- /dev/null +++ b/sql/convert-dacpac-to-mdf.ps1 @@ -0,0 +1,78 @@ +##################################### Configuration #################################### +$sqlInstallationBinFolder = "C:\Program Files (x86)\Microsoft SQL Server\140\DAC\bin" +$sqlUser = "sa" +$sqlPassword = "Wsadzec1" +$serverName = "VICTORINOX" +# Optional +$dbLocation = $PSScriptRoot +# Const +$tempDbNamePrefix = "PoweShellTransformation." +######################################################################################## + +function Test-SQLConnection { + [OutputType([bool])] + Param + ( + [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true, Position = 0)] + $ConnectionString + ) + try { + $sqlConnection = New-Object System.Data.SqlClient.SqlConnection $ConnectionString; + $sqlConnection.Open(); + $sqlConnection.Close(); + + return $true; + } + catch { + return $false; + } +} + +if (-not (Test-Path $sqlInstallationBinFolder)) { + Write-Host "Incorrect sqlInstallationBinFolder: $sqlInstallationBinFolder" -ForegroundColor Red + exit +} + +if (-not (Test-Path "$sqlInstallationBinFolder\SqlPackage.exe")) { + Write-Host "Could not find SqlPackage.exe: $sqlInstallationBinFolder\SqlPackage.exe" -ForegroundColor Red + exit +} + +if (-not (Test-SQLConnection "Data Source=$serverName;database=master;User ID=$sqlUser;Password=$sqlPassword;")) { + Write-Host "Could not connect to a database. Check credentials" -ForegroundColor Red + exit +} + + +if (-not(Test-Path "$dbLocation\mdf")) { + New-Item -ItemType directory -Path "$dbLocation\mdf" +} + +$start = Get-Date +Get-ChildItem -Path $dbLocation | ? { $_.Extension -eq ".dacpac" } | % { + $name = $tempDbNamePrefix + $_.Name.Replace(".dacpac", "") + $srcPath = $_.FullName + + # publish db from script + Write-Host "Processing $($_.Name)" -ForegroundColor Green + & "$sqlInstallationBinFolder\SqlPackage.exe" /action:Publish /SourceFile:$srcPath /TargetServerName:$serverName /TargetDatabaseName:$name /TargetUser:$sqlUser /TargetPassword:$sqlPassword + + # get database files paths + $query = "select name, physical_name from sys.master_files where name like '$name%'" + $paths = Invoke-Sqlcmd -ServerInstance $serverName -Database "master" -Query $query -Username $sqlUser -Password $sqlPassword | % { $_.physical_name } + + # detach database + $query = "sp_detach_db '$name', 'true';" + Invoke-Sqlcmd -ServerInstance $serverName -Database "master" -Query $query -Username $sqlUser -Password $sqlPassword + + # move mdf and ldf files + $paths | % { Move-Item -Path $_ -Destination "$dbLocation\mdf" -Force } +} + +# set file names +Get-ChildItem -Path "$dbLocation\mdf" | % { + $newName = $_.Name.Replace("_Primary", "").Replace($tempDbNamePrefix, [string]::Empty) + Rename-Item -Path $_.FullName -NewName $newName +} +$end = Get-Date +$end - $start \ No newline at end of file diff --git a/sql/create-db-from-dacpac.ps1 b/sql/create-db-from-dacpac.ps1 new file mode 100644 index 0000000..037ad23 --- /dev/null +++ b/sql/create-db-from-dacpac.ps1 @@ -0,0 +1,83 @@ +param( + [parameter(Mandatory = $true, Position = 0)] + [string]$sqlUser, + [parameter(Mandatory = $true, Position = 1)] + [string]$sqlPassword, + [parameter(Mandatory = $true, Position = 2)] + [string]$serverName, + [parameter(Mandatory = $false, Position = 3)] + [string]$sqlInstallationBinFolder = "C:\Program Files (x86)\Microsoft SQL Server\140\DAC\bin" +) + + +# Const +$dbLocation = "$PSScriptRoot\temp\dacpac" +$tempDbNamePrefix = "PoweShellTransformation." + +function Test-SQLConnection { + [OutputType([bool])] + Param + ( + [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true, Position = 0)] + $ConnectionString + ) + try { + $sqlConnection = New-Object System.Data.SqlClient.SqlConnection $ConnectionString; + $sqlConnection.Open(); + $sqlConnection.Close(); + + return $true; + } + catch { + return $false; + } +} + +if (-not (Test-Path $sqlInstallationBinFolder)) { + Write-Host "Incorrect sqlInstallationBinFolder: $sqlInstallationBinFolder" -ForegroundColor Red + exit +} + +if (-not (Test-Path "$sqlInstallationBinFolder\SqlPackage.exe")) { + Write-Host "Could not find SqlPackage.exe: $sqlInstallationBinFolder\SqlPackage.exe" -ForegroundColor Red + exit +} + +if (-not (Test-SQLConnection "Data Source=$serverName;database=master;User ID=$sqlUser;Password=$sqlPassword;")) { + Write-Host "Could not connect to a database. Check credentials" -ForegroundColor Red + exit +} + + +if (-not(Test-Path "$dbLocation\mdf")) { + New-Item -ItemType directory -Path "$dbLocation\mdf" +} + +$start = Get-Date +Get-ChildItem -Path $dbLocation | ? { $_.Extension -eq ".dacpac" } | % { + $name = $tempDbNamePrefix + $_.Name.Replace(".dacpac", "") + $srcPath = $_.FullName + + # publish db from script + Write-Host "Processing $($_.Name)" -ForegroundColor Green + & "$sqlInstallationBinFolder\SqlPackage.exe" /action:Publish /SourceFile:$srcPath /TargetServerName:$serverName /TargetDatabaseName:$name /TargetUser:$sqlUser /TargetPassword:$sqlPassword + + # get database files paths + $query = "select name, physical_name from sys.master_files where name like '$name%'" + $paths = Invoke-Sqlcmd -ServerInstance $serverName -Database "master" -Query $query -Username $sqlUser -Password $sqlPassword | % { $_.physical_name } + + # detach database + $query = "sp_detach_db '$name', 'true';" + Invoke-Sqlcmd -ServerInstance $serverName -Database "master" -Query $query -Username $sqlUser -Password $sqlPassword + + # move mdf and ldf files + $paths | % { Move-Item -Path $_ -Destination "$dbLocation\mdf" -Force } +} + +# set file names +Get-ChildItem -Path "$dbLocation\mdf" | % { + $newName = $_.Name.Replace("_Primary", "").Replace($tempDbNamePrefix, [string]::Empty) + Rename-Item -Path $_.FullName -NewName $newName +} +$end = Get-Date +$end - $start \ No newline at end of file