diff --git a/CHANGELOG.md b/CHANGELOG.md index 11c74ab14..2163ff367 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fixed `Test-TargetResource` to return `$false` (instead of throwing) when the SQL script file is missing, enabling `DependsOn` scenarios where the file is created at runtime. +- SqlDatabase + - Fixed logic in `Set-SqlDscDatabaseProperty` so pipeline input is properly + handled in the cmdlet's `Process` block. ([issue #2456](https://github.com/dsccommunity/SqlServerDsc/issues/2456)) ### Changed diff --git a/source/Public/Set-SqlDscDatabaseProperty.ps1 b/source/Public/Set-SqlDscDatabaseProperty.ps1 index d87ca2e19..bb6cc99f4 100644 --- a/source/Public/Set-SqlDscDatabaseProperty.ps1 +++ b/source/Public/Set-SqlDscDatabaseProperty.ps1 @@ -676,15 +676,36 @@ function Set-SqlDscDatabaseProperty { $ConfirmPreference = 'None' } + } - # Get the server object based on parameter set - $serverInstance = if ($PSCmdlet.ParameterSetName -eq 'DatabaseObjectSet') - { - $DatabaseObject.Parent - } - else + process + { + # Get the database object based on the parameter set + switch ($PSCmdlet.ParameterSetName) { - $ServerObject + 'ServerObjectSet' + { + Write-Verbose -Message ($script:localizedData.Database_Set -f $Name, $ServerObject.InstanceName) + + $previousErrorActionPreference = $ErrorActionPreference + $ErrorActionPreference = 'Stop' + + $serverInstance = $ServerObject + + $sqlDatabaseObject = $ServerObject | + Get-SqlDscDatabase -Name $Name -Refresh:$Refresh -ErrorAction 'Stop' + + $ErrorActionPreference = $previousErrorActionPreference + } + + 'DatabaseObjectSet' + { + Write-Verbose -Message ($script:localizedData.Database_Set -f $DatabaseObject.Name, $DatabaseObject.Parent.InstanceName) + + $serverInstance = $DatabaseObject.Parent + + $sqlDatabaseObject = $DatabaseObject + } } # Validate compatibility level if specified @@ -724,33 +745,6 @@ function Set-SqlDscDatabaseProperty ) } } - } - - process - { - # Get the database object based on the parameter set - switch ($PSCmdlet.ParameterSetName) - { - 'ServerObjectSet' - { - Write-Verbose -Message ($script:localizedData.Database_Set -f $Name, $ServerObject.InstanceName) - - $previousErrorActionPreference = $ErrorActionPreference - $ErrorActionPreference = 'Stop' - - $sqlDatabaseObject = $ServerObject | - Get-SqlDscDatabase -Name $Name -Refresh:$Refresh -ErrorAction 'Stop' - - $ErrorActionPreference = $previousErrorActionPreference - } - - 'DatabaseObjectSet' - { - Write-Verbose -Message ($script:localizedData.Database_Set -f $DatabaseObject.Name, $DatabaseObject.Parent.InstanceName) - - $sqlDatabaseObject = $DatabaseObject - } - } # Remove common parameters and function-specific parameters, leaving only database properties $boundParameters = Remove-CommonParameter -Hashtable $PSBoundParameters diff --git a/tests/Integration/Commands/Set-SqlDscDatabaseProperty.Integration.Tests.ps1 b/tests/Integration/Commands/Set-SqlDscDatabaseProperty.Integration.Tests.ps1 index 0b132c0ee..354bca580 100644 --- a/tests/Integration/Commands/Set-SqlDscDatabaseProperty.Integration.Tests.ps1 +++ b/tests/Integration/Commands/Set-SqlDscDatabaseProperty.Integration.Tests.ps1 @@ -192,6 +192,30 @@ Describe 'Set-SqlDscDatabaseProperty' -Tag @('Integration_SQL2017', 'Integration $updatedDb = Get-SqlDscDatabase -ServerObject $script:serverObject -Name $script:testDatabaseNameForObject -ErrorAction 'Stop' $updatedDb.RecoveryModel | Should -Be 'BulkLogged' } + + It 'Should set compatibility level successfully using pipeline database object' { + # Use Version140 which is supported on all tested versions (SQL 2017+) + $databaseObject = Get-SqlDscDatabase -ServerObject $script:serverObject -Name $script:testDatabaseNameForObject -ErrorAction 'Stop' + $databaseObject | Set-SqlDscDatabaseProperty -CompatibilityLevel 'Version140' -Force -ErrorAction 'Stop' + + # Verify the change + $updatedDb140 = Get-SqlDscDatabase -ServerObject $script:serverObject -Name $script:testDatabaseNameForObject -ErrorAction 'Stop' + $updatedDb140.CompatibilityLevel | Should -Be 'Version140' + } + + It 'Should change compatibility level successfully using pipeline database object' { + $databaseObject = Get-SqlDscDatabase -ServerObject $script:serverObject -Name $script:testDatabaseNameForObject -ErrorAction 'Stop' + $databaseObject | Set-SqlDscDatabaseProperty -CompatibilityLevel 'Version130' -Force -ErrorAction 'Stop' + + # Verify Version130 is set + $updatedDb140 = Get-SqlDscDatabase -ServerObject $script:serverObject -Name $script:testDatabaseNameForObject -ErrorAction 'Stop' + $updatedDb140.CompatibilityLevel | Should -Be 'Version130' + + # Change to Version140 which is supported on all tested versions (SQL 2017+) + $databaseObject | Set-SqlDscDatabaseProperty -CompatibilityLevel 'Version140' -Force -ErrorAction 'Stop' + $updatedDb160 = Get-SqlDscDatabase -ServerObject $script:serverObject -Name $script:testDatabaseNameForObject -ErrorAction 'Stop' + $updatedDb160.CompatibilityLevel | Should -Be 'Version140' + } } Context 'When using the Refresh parameter' {