internal/functions/generation/Enable-SldgCircularFKConstraint.ps1
|
function Enable-SldgCircularFKConstraint { <# .SYNOPSIS Re-enables FK constraints that were disabled for circular dependencies. .DESCRIPTION Must be called after data insertion to restore FK constraint checking. Mirrors Disable-SldgCircularFKConstraint: session-wide toggles are switched back on, per-constraint toggles are re-enabled one by one. Returns a list of constraints that failed to re-enable (requires manual intervention). #> [CmdletBinding()] param ( [Parameter(Mandatory)] [SqlLabDataGenerator.DisabledForeignKeySet]$DisabledInfo, [Parameter(Mandatory)] [SqlLabDataGenerator.Connection]$ConnectionInfo, [System.Data.Common.DbTransaction]$Transaction ) $failures = [System.Collections.Generic.List[string]]::new() if ($DisabledInfo.DisabledTables.Count -eq 0) { return $failures } $dialect = $ConnectionInfo.GetDialect() $runStatement = { param([string]$Sql, [System.Data.Common.DbTransaction]$ActiveTransaction) $fkCmd = $ConnectionInfo.DbConnection.CreateCommand() try { if ($ActiveTransaction) { $fkCmd.Transaction = $ActiveTransaction } $fkCmd.CommandText = $Sql [void]$fkCmd.ExecuteNonQuery() } finally { $fkCmd.Dispose() } } $sessionWide = $DisabledInfo.SessionWide -or ($DisabledInfo.DisabledConstraintNames.Count -eq 0 -and $dialect.EnableAllForeignKeysStatement) if ($sessionWide -and $dialect.EnableAllForeignKeysStatement) { try { & $runStatement -Sql $dialect.EnableAllForeignKeysStatement -ActiveTransaction $Transaction Write-PSFMessage -Level Verbose -String 'Generation.FKReenabledPragma' } catch { Write-PSFMessage -Level Warning -String 'Generation.FKReenablePragmaFailed' -StringValues $_.Exception.Message $failures.Add("$($dialect.Name) session-wide foreign keys: $($_.Exception.Message)") } return $failures } foreach ($entry in $DisabledInfo.DisabledConstraintNames) { $parts = $entry -split '\|', 2 $tblFullName = $parts[0] $fkName = $parts[1] $ct = $DisabledInfo.DisabledTables | Where-Object { $_.FullName -eq $tblFullName } | Select-Object -First 1 if (-not $ct) { continue } try { $safeName = $dialect.QualifiedName($ct.SchemaName, $ct.TableName) $safeFKName = $dialect.QuoteIdentifier($fkName) & $runStatement -Sql $dialect.EnableForeignKeyStatement($safeName, $safeFKName) -ActiveTransaction $Transaction Write-PSFMessage -Level Verbose -String 'Generation.FKReenabledTable' -StringValues "$tblFullName.$fkName" } catch { Write-PSFMessage -Level Warning -String 'Generation.FKReenableTableFailed' -StringValues "$tblFullName.$fkName", $_.Exception.Message $failures.Add("$tblFullName.$fkName") } } $failures } |