Skip to content

Commit dc58134

Browse files
Export-DbaScript: Handle Distributed Availability Groups gracefully (#10216)
1 parent b94e33e commit dc58134

1 file changed

Lines changed: 25 additions & 10 deletions

File tree

public/Export-DbaScript.ps1

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -227,12 +227,23 @@ function Export-DbaScript {
227227
Write-Message -Level Warning -Message "Support for $shorttype is limited at this time."
228228
}
229229

230+
$dagScript = $null
230231
if ($shorttype -eq "AvailabilityGroup") {
231-
Write-Message -Level Verbose -Message "Invoking .Script() as a workaround for https://github.com/dataplat/dbatools/issues/5913."
232-
try {
233-
$null = $InputObject.Script()
234-
} catch {
235-
Write-Message -Level Verbose -Message "Invoking .Script() failed: $_"
232+
if ((Get-Member -InputObject $object -Name IsDistributedAvailabilityGroup -ErrorAction SilentlyContinue) -and $object.IsDistributedAvailabilityGroup) {
233+
Write-Message -Level Verbose -Message "Detected Distributed Availability Group '$($object.Name)'. Generating T-SQL script manually as SMO scripting does not support Distributed AGs."
234+
$dagReplicaScripts = foreach ($replica in $object.AvailabilityReplicas) {
235+
$availMode = if ($replica.AvailabilityMode -eq "SynchronousCommit") { "SYNCHRONOUS_COMMIT" } else { "ASYNCHRONOUS_COMMIT" }
236+
$seedMode = if ($replica.SeedingMode -eq "Automatic") { "AUTOMATIC" } else { "MANUAL" }
237+
" N'$($replica.Name)' WITH$eol ($eol LISTENER_URL = N'$($replica.EndpointUrl)',$eol AVAILABILITY_MODE = $availMode,$eol FAILOVER_MODE = MANUAL,$eol SEEDING_MODE = $seedMode$eol )"
238+
}
239+
$dagScript = "CREATE AVAILABILITY GROUP [$($object.Name)]$eol WITH (DISTRIBUTED)$eol AVAILABILITY GROUP ON$eol$($dagReplicaScripts -join ",$eol");"
240+
} else {
241+
Write-Message -Level Verbose -Message "Invoking .Script() as a workaround for https://github.com/dataplat/dbatools/issues/5913."
242+
try {
243+
$null = $InputObject.Script()
244+
} catch {
245+
Write-Message -Level Verbose -Message "Invoking .Script() failed: $_"
246+
}
236247
}
237248
}
238249

@@ -295,14 +306,14 @@ function Export-DbaScript {
295306
if ($Passthru) {
296307
if ($ScriptingOptionsObject) {
297308
$ScriptingOptionsObject.FileName = $null
298-
foreach ($scriptpart in $scripter.EnumScript($object)) {
309+
foreach ($scriptpart in @(if ($dagScript) { $dagScript } else { $scripter.EnumScript($object) })) {
299310
if ($scriptBatchTerminator) {
300311
$scriptpart = "$scriptpart$eol$BatchSeparator$eol"
301312
}
302313
$scriptpart | Out-String
303314
}
304315
} else {
305-
foreach ($scriptpart in $scripter.EnumScript($object)) {
316+
foreach ($scriptpart in @(if ($dagScript) { $dagScript } else { $scripter.EnumScript($object) })) {
306317
if ($BatchSeparator) {
307318
$scriptpart = "$scriptpart$eol$BatchSeparator$eol"
308319
} else {
@@ -320,10 +331,14 @@ function Export-DbaScript {
320331
if (-not $ScriptingOptionsObject.FileName) {
321332
$ScriptingOptionsObject.FileName = $scriptPath
322333
}
323-
$null = $object.Script($ScriptingOptionsObject)
334+
if ($dagScript) {
335+
"$dagScript$eol$BatchSeparator$eol" | Out-File -FilePath $ScriptingOptionsObject.FileName -Encoding $encoding -Append
336+
} else {
337+
$null = $object.Script($ScriptingOptionsObject)
338+
}
324339
} else {
325340
$ScriptingOptionsObject.FileName = $null
326-
$scriptInFull = foreach ($scriptpart in $scripter.EnumScript($object)) {
341+
$scriptInFull = foreach ($scriptpart in @(if ($dagScript) { $dagScript } else { $scripter.EnumScript($object) })) {
327342
if ($BatchSeparator) {
328343
$scriptpart = "$scriptpart$eol$BatchSeparator$eol"
329344
} else {
@@ -334,7 +349,7 @@ function Export-DbaScript {
334349
$scriptInFull | Out-File -FilePath $scriptPath -Encoding $encoding -Append
335350
}
336351
} else {
337-
$scriptInFull = foreach ($scriptpart in $scripter.EnumScript($object)) {
352+
$scriptInFull = foreach ($scriptpart in @(if ($dagScript) { $dagScript } else { $scripter.EnumScript($object) })) {
338353
if ($BatchSeparator) {
339354
$scriptpart = "$scriptpart$eol$BatchSeparator$eol"
340355
} else {

0 commit comments

Comments
 (0)