Skip to content

Commit dc0e0d0

Browse files
author
Uwe Janke
committed
v1.9.0.0: add Compare-sqmAlwaysOnRoles - Server-Rollen-Vergleich innerhalb einer AlwaysOn AG
AlwaysOn repliziert nur die Datenbanken, nicht master - Server-Principals und deren Server-Rollen-Mitgliedschaft (sysadmin, dbcreator, securityadmin, ab SQL Server 2022 auch benutzerdefinierte Server-Rollen) werden nicht automatisch synchron gehalten. Nach einem Failover kann ein Login auf dem neuen Primary z.B. kein sysadmin mehr sein, ohne dass das bisher auffiel. Diagnostisches Geschwister von Compare-sqmAlwaysOnLogins (dort: Login- Attribute; hier: Rollen-Mitgliedschaft), gleiches Muster: AG-/Replica- Aufloesung, System-Login-Filter, -Login/-ExcludeLogin, -OnlyDifferences, TXT/HTML-Report, -FailOnDrift (Event 9010 - erste freie Nummer, 9001-9009 waren belegt). Critical bei fehlendem Login oder abweichender sysadmin- Mitgliedschaft, Warning bei anderen Rollenabweichungen. Datenbank-Rollen bewusst nicht Teil des Vergleichs (liegen in der replizierten Datenbank). Verifiziert auf DEV02: Rollen-Query liefert korrekte Daten inkl. is_fixed_role und einer realen benutzerdefinierten Server-Rolle; "keine AG gefunden"-Pfad sauber getestet (DEV02 hat keine AlwaysOn-Gruppe, echter Mehr-Replica-Vergleich konnte daher nicht End-to-End verifiziert werden). category-map.ps1, _gen-reference.ps1, FunctionsToExport, reference.html (via pwsh, siehe 1.8.17.0) und AlwaysOn-Betriebs-Tools.md entsprechend ergaenzt.
1 parent c26c4aa commit dc0e0d0

7 files changed

Lines changed: 634 additions & 6 deletions

CHANGELOG.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,33 @@
11
# sqmSQLTool — Changelog
22

3+
## [1.9.0.0] — 2026-07-02
4+
5+
### Neue Funktion
6+
7+
**`Compare-sqmAlwaysOnRoles`** — Server-Rollen-Vergleich innerhalb einer AlwaysOn AG
8+
- AlwaysOn repliziert nur die Datenbanken, nicht `master` — Server-Principals
9+
(Logins) *und* deren Server-Rollen-Mitgliedschaft (sysadmin, dbcreator,
10+
securityadmin, ab SQL Server 2022 auch benutzerdefinierte Server-Rollen)
11+
werden nicht automatisch synchron gehalten. Nach einem Failover kann ein
12+
Login auf dem neuen Primary z. B. kein sysadmin mehr sein (oder umgekehrt zu
13+
viele Rechte haben), ohne dass das bisher auffiel.
14+
- Diagnostisches Geschwister von `Compare-sqmAlwaysOnLogins` (dort:
15+
Login-Existenz/-Attribute; hier: Rollen-Mitgliedschaft). Gleiches Muster:
16+
AG-/Replica-Auflösung, System-Login-Filter, `-Login`/`-ExcludeLogin`,
17+
`-OnlyDifferences`, TXT/HTML-Report, `-FailOnDrift` (Windows Event Log,
18+
Source `sqmSQLTool`, EventId **9010** — erste freie Nummer, 9001-9009 waren
19+
bereits belegt).
20+
- Statusbewertung: Critical bei fehlendem Login auf einer Replica ODER
21+
abweichender `sysadmin`-Mitgliedschaft (höchstprivilegierte Rolle); Warning
22+
bei jeder anderen abweichenden Rolle; OK bei identischem Rollen-Set.
23+
- Datenbank-Rollen sind bewusst nicht Teil des Vergleichs (liegen innerhalb
24+
der replizierten Datenbank, damit strukturell kaum divergent).
25+
- Verifiziert auf DEV02: Rollen-Abfrage liefert korrekte Daten inkl.
26+
`is_fixed_role` (SQL Server 2022) und einer real vorhandenen
27+
benutzerdefinierten Server-Rolle; "keine AG gefunden"-Pfad sauber getestet
28+
(DEV02 hat keine AlwaysOn-Gruppe, echter Mehr-Replica-Vergleich konnte
29+
daher nicht End-to-End verifiziert werden).
30+
331
## [1.8.19.0] — 2026-07-02
432

533
### Bugfix (kritisch)

Docs/AlwaysOn-Betriebs-Tools.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ Logins oder Datenbanken auf einem Read-Only-Secondary).
104104
|---|---|
105105
| `Sync-sqmLoginsToAlwaysOn` | Synchronisiert Logins vom Primary zu allen Secondary-Replicas. |
106106
| `Compare-sqmAlwaysOnLogins` | Vergleicht Logins aller Replicas (Vorhandensein, Default-DB, Sprache, Passwort-Hash, SID). |
107+
| `Compare-sqmAlwaysOnRoles` | Vergleicht Server-Rollen-Mitgliedschaft aller Replicas (fixe + benutzerdefinierte Rollen; sysadmin-Abweichung = Critical). |
107108
| `Sync-sqmAgNode` | Synchronisiert weitere Serverobjekte (Logins, Jobs u. a.) vom Primary zu allen Secondaries. |
108109

109110
### `-Force`: bestehende Logins aktualisieren — ohne Self-Lockout
@@ -216,7 +217,8 @@ New-sqmAlwaysOnRepairJob -SqlInstance "SQLPRIM01" -JobName "AO-AutoRepair" -Sche
216217
2. **Failover** — bei Wartung oder Störung `Invoke-sqmFailover` mit integrierten Vor-/Nachprüfungen
217218
statt manuellem `ALTER AVAILABILITY GROUP ... FAILOVER`.
218219
3. **Logins konsistent halten** — nach Änderungen am Primary `Sync-sqmLoginsToAlwaysOn`,
219-
zur Kontrolle `Compare-sqmAlwaysOnLogins`.
220+
zur Kontrolle `Compare-sqmAlwaysOnLogins` (Login-Attribute) und `Compare-sqmAlwaysOnRoles`
221+
(Server-Rollen-Mitgliedschaft — wird von AlwaysOn nicht mitrepliziert).
220222
4. **Automatisieren** — wiederkehrende Aufgaben als Agent-Jobs einrichten
221223
(`New-sqmAutoLoginSyncJob`, `New-sqmAutoLoginCompareJob`, `New-sqmAlwaysOnRepairJob`).
222224
Der Compare-Job geht bei Login-Drift gezielt auf Fail und meldet dies (Operator + Windows Event Log

Docs/_gen-reference.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ $cats['deployment'] = @{ Title="$([char]::ConvertFromUtf32(0x1F680)) De
2323
$cats['sonstige'] = @{ Title="$([char]::ConvertFromUtf32(0x1F539)) Other"; Badge='sonstige'; Text='Other' }
2424

2525
$members = [ordered]@{}
26-
$members['alwayson'] = 'Add-sqmDatabaseToAG','Compare-sqmAlwaysOnLogins','Complete-sqmListenerMigration','Export-sqmAlwaysOnConfiguration','Get-sqmAlwaysOnFailoverHistory','Get-sqmAlwaysOnHealthReport','Invoke-sqmAlwaysOnSetup','Invoke-sqmFailover','Invoke-sqmSqlAlwaysOnAutoseeding','Move-sqmAlwaysOnListener','New-sqmAlwaysOnRepairJob','New-sqmAutoLoginSyncJob','New-sqmAvailabilityGroup','Remove-sqmDatabaseFromAG','Repair-sqmAlwaysOnDatabases','Sync-sqmAgNode','Sync-sqmLoginsToAlwaysOn'
26+
$members['alwayson'] = 'Add-sqmDatabaseToAG','Compare-sqmAlwaysOnLogins','Compare-sqmAlwaysOnRoles','Complete-sqmListenerMigration','Export-sqmAlwaysOnConfiguration','Get-sqmAlwaysOnFailoverHistory','Get-sqmAlwaysOnHealthReport','Invoke-sqmAlwaysOnSetup','Invoke-sqmFailover','Invoke-sqmSqlAlwaysOnAutoseeding','Move-sqmAlwaysOnListener','New-sqmAlwaysOnRepairJob','New-sqmAutoLoginSyncJob','New-sqmAvailabilityGroup','Remove-sqmDatabaseFromAG','Repair-sqmAlwaysOnDatabases','Sync-sqmAgNode','Sync-sqmLoginsToAlwaysOn'
2727
$members['distributed-ag'] = 'Add-sqmDatabaseToDistributedAg','Get-sqmDistributedAgHealth','Invoke-sqmDistributedFailover','New-sqmDistributedAvailabilityGroup','Test-sqmDistributedAgReadiness'
2828
$members['service-broker'] = 'Enable-sqmServiceBroker','Get-sqmServiceBrokerHealth','Invoke-sqmServiceBrokerAlwaysOn'
2929
$members['backup-&-restore'] = 'Get-sqmServersFromOU','Invoke-sqmLogShrink','Invoke-sqmRestoreDatabase','Invoke-sqmUserDatabaseBackup','New-sqmBackupMaintenanceJob','New-sqmOlaSysDbBackupJob','New-sqmOlaUsrDbBackupJob','Register-sqmBackupExcludeTrigger','Set-sqmBackupExcludePermission','Show-sqmBackupExcludeForm','Sync-sqmBackupExcludeTable','Test-sqmBackupIntegrity'

Docs/sqmSQLTool-reference.html

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -146,12 +146,13 @@ <h1>🛢 sqmSQLTool</h1>
146146
<!-- SIDEBAR -->
147147
<div class="psdb-st-sidebar">
148148
<input class="psdb-st-sidebar-search" type="text" placeholder="Funktion suchen…" oninput="psstSearch(this.value)">
149-
<div class="psdb-st-nav-group" id="nav-alwayson">
149+
<div class="psdb-st-nav-group" id="nav-alwayson">
150150
<div class="psdb-st-nav-cat" onclick="psstToggleCat('nav-alwayson-list')">
151-
<span>🔄 AlwaysOn</span><span class="psdb-st-nav-count">17</span>
151+
<span>🔄 AlwaysOn</span><span class="psdb-st-nav-count">18</span>
152152
</div>
153153
<ul class="psdb-st-nav-funcs" id="nav-alwayson-list"><li><span class="psdb-st-nav-func" onclick="psstJump('f-addsqmdatabasetoag')">Add-sqmDatabaseToAG</span></li>
154154
<li><span class="psdb-st-nav-func" onclick="psstJump('f-comparesqmalwaysonlogins')">Compare-sqmAlwaysOnLogins</span></li>
155+
<li><span class="psdb-st-nav-func" onclick="psstJump('f-comparesqmalwaysonroles')">Compare-sqmAlwaysOnRoles</span></li>
155156
<li><span class="psdb-st-nav-func" onclick="psstJump('f-completesqmlistenermigration')">Complete-sqmListenerMigration</span></li>
156157
<li><span class="psdb-st-nav-func" onclick="psstJump('f-exportsqmalwaysonconfiguration')">Export-sqmAlwaysOnConfiguration</span></li>
157158
<li><span class="psdb-st-nav-func" onclick="psstJump('f-getsqmalwaysonfailoverhistory')">Get-sqmAlwaysOnFailoverHistory</span></li>
@@ -395,7 +396,7 @@ <h1>🛢 sqmSQLTool</h1>
395396

396397
<!-- CONTENT -->
397398
<div class="psdb-st-content" id="psdb-st-content">
398-
<section class="psdb-st-section" id="cat-alwayson">
399+
<section class="psdb-st-section" id="cat-alwayson">
399400
<h2 class="psdb-st-section-title">🔄 AlwaysOn</h2>
400401

401402
<div class="psdb-st-func-card" id="f-addsqmdatabasetoag">
@@ -440,6 +441,29 @@ <h2 class="psdb-st-section-title">🔄 AlwaysOn</h2>
440441
</div>
441442
</div>
442443

444+
<div class="psdb-st-func-card" id="f-comparesqmalwaysonroles">
445+
<div class="psdb-st-func-header">
446+
<span class="psdb-st-func-name">Compare-sqmAlwaysOnRoles</span>
447+
<span class="psdb-st-badge psdb-st-badge-alwayson">AlwaysOn</span>
448+
</div>
449+
<div class="psdb-st-func-desc">Vergleicht die Server-Rollen-Mitgliedschaft aller Replicas einer AlwaysOn Availability Group.</div>
450+
<div class="psdb-st-examples-toggle" onclick="psstToggleEx(this)">▶ Show 3 examples</div>
451+
<div class="psdb-st-examples">
452+
<div class="psdb-st-example">
453+
<div class="psdb-st-example-label">Compare-sqmAlwaysOnRoles -SqlInstance &quot;SQL01&quot;</div>
454+
<div class="psdb-st-pre-wrap"><pre class="psdb-st-code"> Compare-sqmAlwaysOnRoles -SqlInstance &quot;SQL01&quot;</pre><button class="psdb-st-copy-btn" onclick="psstCopy(this)">copy</button></div>
455+
</div>
456+
<div class="psdb-st-example">
457+
<div class="psdb-st-example-label">Compare-sqmAlwaysOnRoles -SqlInstance &quot;SQL01&quot; -AvailabilityGroupName &quot;AG_Prod&quot; -OnlyDifferences</div>
458+
<div class="psdb-st-pre-wrap"><pre class="psdb-st-code"> Compare-sqmAlwaysOnRoles -SqlInstance &quot;SQL01&quot; -AvailabilityGroupName &quot;AG_Prod&quot; -OnlyDifferences</pre><button class="psdb-st-copy-btn" onclick="psstCopy(this)">copy</button></div>
459+
</div>
460+
<div class="psdb-st-example">
461+
<div class="psdb-st-example-label">Compare-sqmAlwaysOnRoles -SqlInstance &quot;SQL01&quot; | Format-Table</div>
462+
<div class="psdb-st-pre-wrap"><pre class="psdb-st-code"> Compare-sqmAlwaysOnRoles -SqlInstance &quot;SQL01&quot; | Format-Table</pre><button class="psdb-st-copy-btn" onclick="psstCopy(this)">copy</button></div>
463+
</div>
464+
</div>
465+
</div>
466+
443467
<div class="psdb-st-func-card" id="f-completesqmlistenermigration">
444468
<div class="psdb-st-func-header">
445469
<span class="psdb-st-func-name">Complete-sqmListenerMigration</span>
@@ -4062,6 +4086,7 @@ <h2 class="psdb-st-section-title">&#128202; All Functions (143)</h2>
40624086
<tr><td class="psdb-st-ov-fn">Add-sqmDatabaseToAG</td><td>Adds one or more databases to an Always On availability group (AutoSeed).</td></tr>
40634087
<tr><td class="psdb-st-ov-fn">Add-sqmDatabaseToDistributedAg</td><td>Adds a database to a Distributed AlwaysOn Availability Group.</td></tr>
40644088
<tr><td class="psdb-st-ov-fn">Compare-sqmAlwaysOnLogins</td><td>Compares the logins of all replicas in an AlwaysOn availability group.</td></tr>
4089+
<tr><td class="psdb-st-ov-fn">Compare-sqmAlwaysOnRoles</td><td>Vergleicht die Server-Rollen-Mitgliedschaft aller Replicas einer AlwaysOn Availability Group.</td></tr>
40654090
<tr><td class="psdb-st-ov-fn">Compare-sqmServerConfiguration</td><td>Compares important configuration settings between two SQL Server instances.</td></tr>
40664091
<tr><td class="psdb-st-ov-fn">Complete-sqmListenerMigration</td><td>Completes listener migration after cluster team recreates the listener resource.</td></tr>
40674092
<tr><td class="psdb-st-ov-fn">Copy-sqmLogins</td><td>Copies logins from a source SQL Server instance to a target instance.</td></tr>

0 commit comments

Comments
 (0)