internal/functions/validation/Test-SldgUniqueConstraints.ps1
|
function Test-SldgUniqueConstraints { <# .SYNOPSIS Validates unique constraints and primary key uniqueness in generated data. #> [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseSingularNouns', '', Justification = 'Name describes multiple constraints being tested')] [CmdletBinding()] param ( [Parameter(Mandatory)] [SqlLabDataGenerator.Connection]$ConnectionInfo, [Parameter(Mandatory)] [SqlLabDataGenerator.SchemaModel]$SchemaModel ) $results = [System.Collections.Generic.List[object]]::new() $conn = $ConnectionInfo.DbConnection foreach ($table in $SchemaModel.Tables) { $uniqueCols = $table.Columns | Where-Object { $_.IsUnique -or $_.IsPrimaryKey } foreach ($col in $uniqueCols) { Write-PSFMessage -Level Verbose -Message ($script:strings.'Validation.UniqueCheck' -f $table.SchemaName, $table.TableName) $safeName = Get-SldgSafeSqlName -SchemaName $table.SchemaName -TableName $table.TableName -ConnectionInfo $ConnectionInfo $safeCol = Get-SldgSafeSqlName -ColumnName $col.ColumnName -ConnectionInfo $ConnectionInfo $query = @" SELECT $safeCol, COUNT(*) AS DuplicateCount FROM $safeName WHERE $safeCol IS NOT NULL GROUP BY $safeCol HAVING COUNT(*) > 1 "@ $cmd = $conn.CreateCommand() $cmd.CommandText = $query $cmd.CommandTimeout = Get-PSFConfigValue -FullName 'SqlLabDataGenerator.Database.SchemaTimeout' $dt = New-Object System.Data.DataTable try { $reader = $cmd.ExecuteReader() $dt.Load($reader) } finally { if ($reader) { $reader.Close(); $reader.Dispose() } $cmd.Dispose() } $passed = $dt.Rows.Count -eq 0 $duplicateCount = ($dt.Rows | Measure-Object -Property DuplicateCount -Sum).Sum $results.Add([SqlLabDataGenerator.ValidationResult]@{ CheckType = if ($col.IsPrimaryKey) { 'PrimaryKey' } else { 'UniqueConstraint' } TableName = $table.FullName ConstraintName = "$($col.ColumnName)_Unique" Column = $col.ColumnName ReferencedTable = $null ReferencedColumn = $null Passed = $passed Severity = if ($passed) { 'OK' } else { 'Error' } Details = if ($passed) { 'All values unique' } else { "$duplicateCount duplicate values across $($dt.Rows.Count) distinct values" } }) if (-not $passed) { Write-PSFMessage -Level Warning -Message ($script:strings.'Validation.UniqueViolation' -f $table.SchemaName, $table.TableName, $col.ColumnName, $duplicateCount) } } } $results } |