Skip to content

Commit df08d29

Browse files
Copy-DbaDatabase - Fix SetSourceOffline to only run on successful copy (#9880)
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
1 parent d479872 commit df08d29

File tree

2 files changed

+85
-1
lines changed

2 files changed

+85
-1
lines changed

public/Copy-DbaDatabase.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1449,7 +1449,7 @@ function Copy-DbaDatabase {
14491449
$copyDatabaseStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject
14501450
}
14511451

1452-
if ($SetSourceOffline -and $sourceServer.databases[$dbName].status -notlike '*offline*') {
1452+
if ($SetSourceOffline -and $copyDatabaseStatus.Status -eq "Successful" -and $sourceServer.databases[$dbName].status -notlike '*offline*') {
14531453
if ($Pscmdlet.ShouldProcess($source, "Setting $dbName offline")) {
14541454
Set-DbaDbState -SqlInstance $sourceServer -Database $dbName -Offline -Force
14551455
}

tests/Copy-DbaDatabase.Tests.ps1

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,90 @@ Describe $CommandName -Tag IntegrationTests {
511511
}
512512
}
513513

514+
Context "SetSourceOffline regression test for issue #9546" {
515+
BeforeAll {
516+
$PSDefaultParameterValues["*-Dba*:EnableException"] = $true
517+
518+
$splatStopProcess = @{
519+
SqlInstance = $TestConfig.instance2, $TestConfig.instance3
520+
Program = "dbatools PowerShell module - dbatools.io"
521+
}
522+
Get-DbaProcess @splatStopProcess | Stop-DbaProcess -WarningAction SilentlyContinue
523+
524+
$random = Get-Random
525+
$offlineTestDb = "dbatoolsci_offline_test$random"
526+
527+
$server2 = Connect-DbaInstance -SqlInstance $TestConfig.instance2
528+
$server2.Query("CREATE DATABASE $offlineTestDb; ALTER DATABASE $offlineTestDb SET AUTO_CLOSE OFF WITH ROLLBACK IMMEDIATE")
529+
530+
$server3 = Connect-DbaInstance -SqlInstance $TestConfig.instance3
531+
$server3.Query("CREATE DATABASE $offlineTestDb; ALTER DATABASE $offlineTestDb SET AUTO_CLOSE OFF WITH ROLLBACK IMMEDIATE")
532+
533+
$PSDefaultParameterValues.Remove("*-Dba*:EnableException")
534+
}
535+
536+
AfterAll {
537+
$PSDefaultParameterValues["*-Dba*:EnableException"] = $true
538+
539+
$splatRemoveDbs = @{
540+
SqlInstance = $TestConfig.instance2, $TestConfig.instance3
541+
Database = $offlineTestDb
542+
}
543+
Remove-DbaDatabase @splatRemoveDbs -ErrorAction SilentlyContinue
544+
545+
$PSDefaultParameterValues.Remove("*-Dba*:EnableException")
546+
}
547+
548+
It "Should not set source database offline when copy operation fails" {
549+
$splatCopyOffline = @{
550+
Source = $TestConfig.instance2
551+
Destination = $TestConfig.instance3
552+
Database = $offlineTestDb
553+
BackupRestore = $true
554+
UseLastBackup = $true
555+
SetSourceOffline = $true
556+
WarningAction = "SilentlyContinue"
557+
}
558+
$results = Copy-DbaDatabase @splatCopyOffline
559+
560+
$results.Status | Should -Be "Skipped"
561+
$results.Notes | Should -Be "Already exists on destination"
562+
563+
$sourceDb = Get-DbaDatabase -SqlInstance $TestConfig.instance2 -Database $offlineTestDb
564+
$sourceDb.Status | Should -Not -BeLike "*Offline*"
565+
}
566+
567+
It "Should set source database offline when copy operation succeeds" {
568+
$splatRemoveDestDb = @{
569+
SqlInstance = $TestConfig.instance3
570+
Database = $offlineTestDb
571+
}
572+
Remove-DbaDatabase @splatRemoveDestDb
573+
574+
$splatBackup = @{
575+
SqlInstance = $TestConfig.instance2
576+
Database = $offlineTestDb
577+
BackupDirectory = $NetworkPath
578+
}
579+
$null = Backup-DbaDatabase @splatBackup
580+
581+
$splatCopySuccess = @{
582+
Source = $TestConfig.instance2
583+
Destination = $TestConfig.instance3
584+
Database = $offlineTestDb
585+
BackupRestore = $true
586+
UseLastBackup = $true
587+
SetSourceOffline = $true
588+
}
589+
$results = Copy-DbaDatabase @splatCopySuccess
590+
591+
$results[0].Status | Should -Be "Successful"
592+
593+
$sourceDb = Get-DbaDatabase -SqlInstance $TestConfig.instance2 -Database $offlineTestDb
594+
$sourceDb.Status | Should -BeLike "*Offline*"
595+
}
596+
}
597+
514598
if ($env:azurepasswd) {
515599
Context "Copying via Azure storage" {
516600
BeforeAll {

0 commit comments

Comments
 (0)