Public/Tasks/Invoke-DropSqlDatabaseTask.ps1
#Requires -Modules SitecoreInstallFramework, SitecoreFundamentals, SqlServer Set-StrictMode -Version Latest Write-Verbose "Loading $($MyInvocation.MyCommand.Path)" Function Invoke-DropSqlDatabaseTask { [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword", "")] [CmdletBinding(SupportsShouldProcess = $true)] param ( [Parameter(Mandatory = $true)] [string]$SqlServer, [Parameter(Mandatory = $true)] [string[]]$SqlDatabases, [Parameter(Mandatory = $true)] [string]$SqlAdminUser, [Parameter(Mandatory = $true)] [string]$SqlAdminPassword, [string]$TaskName = "DropSqlDatabase" ) Set-PSDebug -Strict function Test-SqlDatabase { param ( [Parameter(Mandatory = $true)] [string]$SqlServer, [Parameter(Mandatory = $true)] [string]$SqlDatabase, [Parameter(Mandatory = $true)] [string]$SqlAdminUser, [Parameter(Mandatory = $true)] [string]$SqlAdminPassword ) $cmdCheckDb = @" IF EXISTS (SELECT 1 FROM [master].[dbo].[sysdatabases] WHERE [name] = N'$($SqlDatabase)') BEGIN SELECT 1 as result END ELSE BEGIN SELECT 0 as result END "@ try { $cmdresult = Invoke-Sqlcmd -ServerInstance $SqlServer -Database master -Username $SqlAdminUser -Password $SqlAdminPassword -Query $cmdCheckDb -ErrorAction Stop $resultvalue = $false if ($cmdresult.result -eq 1) { $resultValue = $true } $result = New-Object PSCustomObject -Property @{ "result" = $resultvalue } } catch { $result = New-Object PSCustomObject -Property @{ "result" = $false } } return $result.result } function Remove-SqlDatabase { [CmdletBinding(SupportsShouldProcess = $true)] param ( [Parameter(Mandatory = $true)] [string]$SqlServer, [Parameter(Mandatory = $true)] [string]$SqlDatabase, [Parameter(Mandatory = $true)] [string]$SqlAdminUser, [Parameter(Mandatory = $true)] [string]$SqlAdminPassword ) if ($PSCmdlet.ShouldProcess($SqlDatabase)) { $dbExists = Test-SqlDatabase -SqlServer $SqlServer -SqlDatabase $SqlDatabase -SqlAdminUser $SqlAdminUser -SqlAdminPassword $SqlAdminPassword if ($dbExists) { Write-TaskInfo -Message "[$SqlDatabase] exists. Attempting removal." -Tag 'SQL' -TaskName $TaskName $cmdDropDb = " EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N'[$($SqlDatabase)]' GO USE [master] GO ALTER DATABASE [$($SqlDatabase)] SET SINGLE_USER WITH ROLLBACK IMMEDIATE GO USE [master] GO DROP DATABASE [$($SqlDatabase)] GO" $msg = "Executing SQL Query: '$($cmdDropDb)'" Write-Debug $msg Invoke-Sqlcmd -ServerInstance $SqlServer -Database master -Username $SqlAdminUser -Password $SqlAdminPassword -Query $cmdDropDb -ErrorAction Stop $dbExists = Test-SqlDatabase -SqlServer $SqlServer -SqlDatabase $SqlDatabase -SqlAdminUser $SqlAdminUser -SqlAdminPassword $SqlAdminPassword if ($dbExists) { Write-Warning -Message "[$SqlDatabase] still exists." Write-TaskInfo -Message "[$SqlDatabase] still exists." -Tag 'SQL' -TaskName $TaskName } else { Write-TaskInfo -Message "[$SqlDatabase] dropped successfully" -Tag 'SQL' -TaskName $TaskName } } else { Write-TaskInfo -Message "[$SqlDatabase] does not exist. No action required." -Tag 'SQL' -TaskName $TaskName } } } foreach ($SqlDatabase in $SqlDatabases) { Remove-SqlDatabase $SqlServer $SqlDatabase $SqlAdminUser $SqlAdminPassword } } Register-SitecoreInstallExtension -Command Invoke-DropSqlDatabaseTask -As DropSqlDatabase -Type Task -Force Write-Verbose "Loaded $($MyInvocation.MyCommand.Path)" |