Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
529759f
Update New-SqlDscDatabase for improved error handling and update test…
johlju Oct 20, 2025
838142e
Update Remove-SqlDscRole for improved error handling using ThrowTermi…
johlju Oct 20, 2025
1f57542
Update Set-SqlDscDatabase for improved error handling using ThrowTerm…
johlju Oct 20, 2025
f8522f1
Update Set-SqlDscAgentAlert for improved error handling using ThrowTe…
johlju Oct 20, 2025
9102fb9
Update Remove-SqlDscDatabase for improved error handling using ThrowT…
johlju Oct 20, 2025
fbc4055
Update Remove-SqlDscAgentAlert for improved error handling using Thro…
johlju Oct 20, 2025
7abc53a
Update Remove-SqlDscRole to improve error handling by using ItemNotFo…
johlju Oct 20, 2025
fa615da
Update Set-SqlDscDatabase to enhance error handling by using specific…
johlju Oct 20, 2025
797cc46
Update SqlServerDsc.strings.psd1 to add error codes for role not foun…
johlju Oct 20, 2025
8d65470
Update Set-SqlDscDatabase to improve error handling by including the …
johlju Oct 20, 2025
0756914
Update error messages in Get-SqlDscRole and Remove-SqlDscRole for con…
johlju Oct 20, 2025
6051b1e
Improve error handling in Get-SqlDscRole by adding return statement a…
johlju Oct 20, 2025
d4b0bf0
Enhance New-SqlDscRole to adjust ConfirmPreference based on Force par…
johlju Oct 20, 2025
06b674d
Adjust ConfirmPreference in Remove-SqlDscDatabase based on Force para…
johlju Oct 20, 2025
743cb5c
Adjust ConfirmPreference handling in Remove-SqlDscRole for Force para…
johlju Oct 20, 2025
107fcd6
Adjust ConfirmPreference handling in Set-SqlDscDatabase for Force par…
johlju Oct 20, 2025
6884f3b
Update error message expectation in Get-SqlDscRole integration test f…
johlju Oct 21, 2025
bf64070
Update error codes in New-SqlDscRole for consistency
johlju Oct 21, 2025
f5bb81b
Refactor ShouldProcess messages in New-SqlDscRole for clarity and con…
johlju Oct 21, 2025
6d3a3de
Refactor ShouldProcess messages in Remove-SqlDscRole for clarity and …
johlju Oct 21, 2025
6c7f034
Refactor Remove-SqlDscDatabase function for improved error handling a…
johlju Oct 21, 2025
33271c9
Refactor error handling in Get-SqlDscRole integration test for non-ex…
johlju Oct 21, 2025
99f3e18
Add DatabaseUserAccess enum for database user access management tests
johlju Oct 21, 2025
b67f844
Refactor error messages in Remove-SqlDscDatabase tests for consistenc…
johlju Oct 21, 2025
8e28bf0
Refactor ShouldProcess messages in Remove-SqlDscDatabase for clarity …
johlju Oct 21, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Changed

- `Remove-SqlDscAgentAlert`
- Now uses `$PSCmdlet.ThrowTerminatingError()` instead of exception helper
functions for proper terminating error handling ([issue #2193](https://github.com/dsccommunity/SqlServerDsc/issues/2193)).
- `Set-SqlDscAgentAlert`
- Now uses `$PSCmdlet.ThrowTerminatingError()` instead of exception helper
functions for proper terminating error handling ([issue #2196](https://github.com/dsccommunity/SqlServerDsc/issues/2196)).
- `Remove-SqlDscDatabase`
- Now uses `$PSCmdlet.ThrowTerminatingError()` instead of exception helper
functions for proper terminating error handling ([issue #2195](https://github.com/dsccommunity/SqlServerDsc/issues/2195)).
- `Remove-SqlDscRole`
- Now uses `$PSCmdlet.ThrowTerminatingError()` instead of exception helper
functions for proper terminating error handling ([issue #2199](https://github.com/dsccommunity/SqlServerDsc/issues/2199)).
- `New-SqlDscDatabase`
- Now uses `$PSCmdlet.ThrowTerminatingError()` instead of exception helper
functions for proper terminating error handling ([issue #2200](https://github.com/dsccommunity/SqlServerDsc/issues/2200)).
- `Set-SqlDscDatabase`
- Now uses `$PSCmdlet.ThrowTerminatingError()` instead of exception helper
functions for proper terminating error handling ([issue #2198](https://github.com/dsccommunity/SqlServerDsc/issues/2198)).
- `Add-SqlDscTraceFlag`
- Improved de-duplication logic to normalize element types to `[System.UInt32]`
before sorting and removing duplicates, ensuring proper handling of mixed
Expand Down
6 changes: 4 additions & 2 deletions source/Public/Get-SqlDscRole.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -73,9 +73,9 @@ function Get-SqlDscRole

if (-not $roleObject)
{
Write-Verbose -Message ($script:localizedData.Role_NotFound -f $Name)
Write-Verbose -Message ($script:localizedData.Get_SqlDscRole_NotFound -f $Name)

$missingRoleMessage = $script:localizedData.Role_NotFound -f $Name
$missingRoleMessage = $script:localizedData.Get_SqlDscRole_NotFound -f $Name

$writeErrorParameters = @{
Message = $missingRoleMessage
Expand All @@ -85,6 +85,8 @@ function Get-SqlDscRole
}

Write-Error @writeErrorParameters

return
}
else
{
Expand Down
20 changes: 18 additions & 2 deletions source/Public/New-SqlDscDatabase.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,15 @@ function New-SqlDscDatabase
if ($CompatibilityLevel -notin $supportedCompatibilityLevels.$($ServerObject.VersionMajor))
{
$errorMessage = $script:localizedData.Database_InvalidCompatibilityLevel -f $CompatibilityLevel, $ServerObject.InstanceName
New-ArgumentException -ArgumentName 'CompatibilityLevel' -Message $errorMessage

$PSCmdlet.ThrowTerminatingError(
[System.Management.Automation.ErrorRecord]::new(
[System.ArgumentException]::new($errorMessage),
'NSD0003', # cspell: disable-line
[System.Management.Automation.ErrorCategory]::InvalidArgument,
$CompatibilityLevel
)
)
}
}

Expand All @@ -157,7 +165,15 @@ function New-SqlDscDatabase
if ($Collation -notin $ServerObject.EnumCollations().Name)
{
$errorMessage = $script:localizedData.Database_InvalidCollation -f $Collation, $ServerObject.InstanceName
New-ArgumentException -ArgumentName 'Collation' -Message $errorMessage

$PSCmdlet.ThrowTerminatingError(
[System.Management.Automation.ErrorRecord]::new(
[System.ArgumentException]::new($errorMessage),
'NSD0004', # cspell: disable-line
[System.Management.Automation.ErrorCategory]::InvalidArgument,
$Collation
)
)
}
}

Expand Down
22 changes: 13 additions & 9 deletions source/Public/New-SqlDscRole.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,14 @@ function New-SqlDscRole
$Refresh
)

begin
{
if ($Force.IsPresent -and -not $Confirm)
{
$ConfirmPreference = 'None'
}
}

process
{
if ($Refresh.IsPresent)
Expand All @@ -88,18 +96,18 @@ function New-SqlDscRole
$PSCmdlet.ThrowTerminatingError(
[System.Management.Automation.ErrorRecord]::new(
[System.InvalidOperationException]::new($errorMessage),
'NSR0001', # cspell: disable-line
'NSDR0001', # cspell: disable-line
[System.Management.Automation.ErrorCategory]::ResourceExists,
$Name
)
)
}

$verboseDescriptionMessage = $script:localizedData.Role_Create_ShouldProcessVerboseDescription -f $Name, $ServerObject.InstanceName
$verboseWarningMessage = $script:localizedData.Role_Create_ShouldProcessVerboseWarning -f $Name
$descriptionMessage = $script:localizedData.Role_Create_ShouldProcessDescription -f $Name, $ServerObject.InstanceName
$confirmationMessage = $script:localizedData.Role_Create_ShouldProcessConfirmation -f $Name
$captionMessage = $script:localizedData.Role_Create_ShouldProcessCaption

if ($Force.IsPresent -or $PSCmdlet.ShouldProcess($verboseDescriptionMessage, $verboseWarningMessage, $captionMessage))
if ($PSCmdlet.ShouldProcess($descriptionMessage, $confirmationMessage, $captionMessage))
{
try
{
Expand All @@ -110,12 +118,8 @@ function New-SqlDscRole
$serverRole.Owner = $Owner
}

Write-Verbose -Message ($script:localizedData.Role_Creating -f $Name)

$serverRole.Create()

Write-Verbose -Message ($script:localizedData.Role_Created -f $Name)

return $serverRole
}
catch
Expand All @@ -125,7 +129,7 @@ function New-SqlDscRole
$PSCmdlet.ThrowTerminatingError(
[System.Management.Automation.ErrorRecord]::new(
[System.InvalidOperationException]::new($errorMessage, $_.Exception),
'NSR0002', # cspell: disable-line
'NSDR0002', # cspell: disable-line
[System.Management.Automation.ErrorCategory]::InvalidOperation,
$Name
)
Expand Down
20 changes: 18 additions & 2 deletions source/Public/Remove-SqlDscAgentAlert.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -117,9 +117,13 @@ function Remove-SqlDscAgentAlert

if ($PSCmdlet.ShouldProcess($verboseDescriptionMessage, $verboseWarningMessage, $captionMessage))
{
Write-Verbose -Message ($script:localizedData.Remove_SqlDscAgentAlert_RemovingAlert -f $alertObjectToRemove.Name)

try
{
Write-Verbose -Message ($script:localizedData.Remove_SqlDscAgentAlert_RemovingAlert -f $alertObjectToRemove.Name)
$originalErrorActionPreference = $ErrorActionPreference

$ErrorActionPreference = 'Stop'

$alertObjectToRemove.Drop()

Expand All @@ -128,7 +132,19 @@ function Remove-SqlDscAgentAlert
catch
{
$errorMessage = $script:localizedData.Remove_SqlDscAgentAlert_RemoveFailed -f $alertObjectToRemove.Name
New-InvalidOperationException -Message $errorMessage -ErrorRecord $_

$PSCmdlet.ThrowTerminatingError(
[System.Management.Automation.ErrorRecord]::new(
[System.InvalidOperationException]::new($errorMessage, $_.Exception),
'RSAA0005', # cspell: disable-line
[System.Management.Automation.ErrorCategory]::InvalidOperation,
$alertObjectToRemove
)
)
}
finally
{
$ErrorActionPreference = $originalErrorActionPreference
}
}
}
Expand Down
110 changes: 67 additions & 43 deletions source/Public/Remove-SqlDscDatabase.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,14 @@ function Remove-SqlDscDatabase
$DropConnections
)

begin
{
if ($Force.IsPresent -and -not $Confirm)
{
$ConfirmPreference = 'None'
}
}

process
{
if ($PSCmdlet.ParameterSetName -eq 'ServerObject')
Expand All @@ -104,74 +112,90 @@ function Remove-SqlDscDatabase
$ServerObject.Databases.Refresh()
}

Write-Verbose -Message ($script:localizedData.Database_Remove -f $Name, $ServerObject.InstanceName)

# Check if the database is a system database (cannot be dropped)
$systemDatabases = @('master', 'model', 'msdb', 'tempdb')
if ($Name -in $systemDatabases)
{
$errorMessage = $script:localizedData.Database_CannotRemoveSystem -f $Name
New-InvalidOperationException -Message $errorMessage
}

# Get the database object
$DatabaseObject = $ServerObject.Databases[$Name]

if (-not $DatabaseObject)
{
$errorMessage = $script:localizedData.Database_NotFound -f $Name
New-InvalidOperationException -Message $errorMessage
$errorMessage = $script:localizedData.Remove_SqlDscDatabase_NotFound -f $Name

$PSCmdlet.ThrowTerminatingError(
[System.Management.Automation.ErrorRecord]::new(
[System.Management.Automation.ItemNotFoundException]::new($errorMessage),
'RSDD0002', # cspell: disable-line
[System.Management.Automation.ErrorCategory]::ObjectNotFound,
$Name
)
)
}
}
else
{
$Name = $DatabaseObject.Name
Write-Verbose -Message ($script:localizedData.Database_Remove -f $Name, $DatabaseObject.Parent.InstanceName)
}

# Check if the database is a system database (cannot be dropped)
$systemDatabases = @('master', 'model', 'msdb', 'tempdb')
if ($Name -in $systemDatabases)
{
$errorMessage = $script:localizedData.Database_CannotRemoveSystem -f $Name
New-InvalidOperationException -Message $errorMessage
}
# Check if the database is a system database (cannot be dropped)
if ($Name -in @('master', 'model', 'msdb', 'tempdb'))
{
$errorMessage = $script:localizedData.Database_CannotRemoveSystem -f $Name

$PSCmdlet.ThrowTerminatingError(
[System.Management.Automation.ErrorRecord]::new(
[System.InvalidOperationException]::new($errorMessage),
'RSDD0001', # cspell: disable-line
[System.Management.Automation.ErrorCategory]::InvalidOperation,
$Name
)
)
}

$verboseDescriptionMessage = $script:localizedData.Database_Remove_ShouldProcessVerboseDescription -f $Name, $DatabaseObject.Parent.InstanceName
$verboseWarningMessage = $script:localizedData.Database_Remove_ShouldProcessVerboseWarning -f $Name
$descriptionMessage = $script:localizedData.Database_Remove_ShouldProcessDescription -f $Name, $DatabaseObject.Parent.InstanceName
$confirmationMessage = $script:localizedData.Database_Remove_ShouldProcessConfirmation -f $Name
$captionMessage = $script:localizedData.Database_Remove_ShouldProcessCaption

if ($Force.IsPresent -or $PSCmdlet.ShouldProcess($verboseDescriptionMessage, $verboseWarningMessage, $captionMessage))
if ($PSCmdlet.ShouldProcess($descriptionMessage, $confirmationMessage, $captionMessage))
{
try
# Drop all active connections if requested
if ($DropConnections.IsPresent)
{
# Drop all active connections if requested
if ($DropConnections.IsPresent)
Write-Verbose -Message ($script:localizedData.Database_DroppingConnections -f $Name)

try
{
Write-Verbose -Message ($script:localizedData.Database_DroppingConnections -f $Name)

try
{
$DatabaseObject.UserAccess = 'Single'
$DatabaseObject.Alter([Microsoft.SqlServer.Management.Smo.TerminationClause]::RollbackTransactionsImmediately)
}
catch
{
$errorMessage = $script:localizedData.Database_DropConnectionsFailed -f $Name
New-InvalidOperationException -Message $errorMessage -ErrorRecord $_
}
$DatabaseObject.UserAccess = [Microsoft.SqlServer.Management.Smo.DatabaseUserAccess]::Single
$DatabaseObject.Alter([Microsoft.SqlServer.Management.Smo.TerminationClause]::RollbackTransactionsImmediately)
}
catch
{
$errorMessage = $script:localizedData.Database_DropConnectionsFailed -f $Name

$PSCmdlet.ThrowTerminatingError(
[System.Management.Automation.ErrorRecord]::new(
[System.InvalidOperationException]::new($errorMessage, $_.Exception),
'RSDD0004', # cspell: disable-line
[System.Management.Automation.ErrorCategory]::InvalidOperation,
$DatabaseObject
)
)
}
}

Write-Verbose -Message ($script:localizedData.Database_Removing -f $Name)

try
{
$DatabaseObject.Drop()

Write-Verbose -Message ($script:localizedData.Database_Removed -f $Name)
}
catch
{
$errorMessage = $script:localizedData.Database_RemoveFailed -f $Name, $DatabaseObject.Parent.InstanceName
New-InvalidOperationException -Message $errorMessage -ErrorRecord $_

$PSCmdlet.ThrowTerminatingError(
[System.Management.Automation.ErrorRecord]::new(
[System.InvalidOperationException]::new($errorMessage, $_.Exception),
'RSDD0005', # cspell: disable-line
[System.Management.Automation.ErrorCategory]::InvalidOperation,
$DatabaseObject
)
)
}
}
}
Expand Down
Loading
Loading