dtcSN – SCOM-basierte SQL Server Dokumentation

dtcSN – SCOM-basierte SQL Server Dokumentation

Automatisierte Extraktion von SQL-Assets aus OperationsManager – Aufbau, Ablauf & Erweiterung

Die Datenbank dtcSN dient als zentrale Steuerungs- und Dokumentationsdatenbank für SQL Server-Umgebungen, die über Microsoft SCOM (System Center Operations Manager) überwacht werden. Ziel ist es, Administratoren eine konsolidierte Sicht auf SQL Server-Instanzen, zugehörige Windows-Computer und Datenbanken zu geben – angereichert mit kundenspezifischen Metadaten, Lebenszyklusinformationen (Support-Ende) und Ausfallkennzeichen (NotFoundSince).

Das System besteht aus einem Satz von 10 Prozeduren, die in einer definierten Reihenfolge Daten aus dem OperationsManager Data Warehouse (OperationsManagerDW) lesen, aufbereiten und in lokale Kern-Tabellen überführen. Das Design setzt auf MERGE-Statements zur Erkennung neuer, geänderter oder nicht mehr vorhandener Objekte (weicher Löschung via NotFoundSince).

📌 Hinweis für die Testumgebung: Die Views vManagedEntity, vManagedEntityProperty etc. sind im Test als leere Platzhalter definiert. In der Produktion verweisen sie auf die entsprechenden Tabellen der OperationsManagerDW-Datenbank (z. B. SELECT * FROM [OperationsManagerDW].dbo.vManagedEntity).

1. Manuell zu pflegende Steuertabellen

Bevor die automatisierten Prozeduren laufen können, müssen folgende Tabellen mit unternehmensspezifischen Werten gefüllt werden:

TabelleZweckInhaltsbeispiel
ManagedSQLEntityTypeDefiniert, welche SCOM-Entity-Typen als SQL Server-Instanzen erkannt werden sollen (z. B. Microsoft.SQLServer.WindowsDBEngine).Aktiv=1 für relevante Typen.
ManagedEntityCompTypeLegt fest, welche SCOM-Entity-Typen als Windows-Computer klassifiziert werden (meist Microsoft.Windows.Computer).RowId 62 ist der Standard.
ManagedEntityDatabaseTypeFiltert Datenbank-Entities (typisch: Microsoft.SQLServer.Database). Nur aktive Typen werden synchronisiert.Aktive=1 für SQL-Datenbanken.
CustomerLegacy-Kundenstamm (Name, Langname, Adresse).Kunde A mit ID 1.
CustomerDomainVerknüpft eine Domäne (z. B. adventure-works.com) mit einem Kunden. Die Funktionen GetCustomerName ermitteln darüber den Kunden zu einer SQL-Instanz.Domain %testcustomer1.local% → CustomerID 1.
ExcludeDBListet Namen von Datenbanken auf, die nicht importiert werden (typisch: master, model, msdb, tempdb, ReportServer).Systemdatenbanken werden ausgeschlossen.
⚠️ Wichtig: Ohne Befüllung dieser Tabellen bleiben die Kern-Tabellen leer oder die Kunden-/Domänenzuordnung funktioniert nicht. Füllen Sie daher vor der ersten Ausführung mindestens ManagedSQLEntityType, ManagedEntityCompType, ManagedEntityDatabaseType und ExcludeDB.

2. Die zehn Kernprozeduren im Überblick

Die Prozeduren sind logisch aufeinander aufgebaut und müssen in der angegebenen Reihenfolge ausgeführt werden. Die Nummerierung (01, 01a, 02, …) gibt die Abhängigkeit vor.

Nr.ProzedurAufgabe
1_01_InsertSQLServerIdentifiziert SQL Server-Instanzen aus SCOM (basierend auf ManagedSQLEntityType) und schreibt Basisdaten (ManagedEntityRowId, Maschine, Domain, Pfad) in die Tabelle SQLServer. Setzt NotFoundSince, wenn eine Instanz nicht mehr im SCOM vorkommt.
2_01a_GetPropertiesForAllSQLEntriesLiest für alle vorhandenen SQL Server-Instanzen die detaillierten Eigenschaften (Edition, Version, ServicePack, TCP-Ports, Installationspfade etc.) über die Prozedur ReadPoperties aus und aktualisiert SQLServer.
3_02_InsertComputerErmittelt Windows-Computer, auf denen die SQL Server-Instanzen laufen (SQLServer.Maschine JOIN mit vManagedEntity + ManagedEntityCompType) und befüllt die Tabelle Computer.
4_02a_GetpropertiesForAllComputerEntriesHolt Eigenschaften der Computer (DNS-Name, IP-Adresse, Prozessoren, Betriebssystem etc.) über ReadPoperties.
5_02b_GetWindowsOSForAllComputerEntrysErgänzt in der Tabelle Computer die Spalte WindowsOS mit dem Betriebssystemnamen aus der SCOM-Entity vom Typ Microsoft.Windows.Computer (Standard-Typ-ID 62).
6_03_InsertSQLDatabasesLiest alle Datenbank-Entities, die über ManagedEntityDatabaseType als aktiv markiert sind (und nicht in ExcludeDB stehen) und schreibt sie in die Tabelle SQLDatabase.
7_03a_GetPropertiesForAllSQLDBSHolt Eigenschaften der Datenbanken (Collation, Recovery Model, Owner, Autogrow-Einstellungen etc.) über ReadPoperties.
8SetCaseSensitivKorrigiert den Pfad (Path) in SQLDatabase, indem er vom zugehörigen SQL Server übernommen wird (nötig, falls SCOM unterschiedliche Schreibweisen liefert).
9ReadPopertiesZentrale Hilfsprozedur: Liest das XML-Property-Feld einer SCOM-Entity aus, parst die einzelnen Eigenschaften und schreibt sie in die entsprechende Ziel-Tabelle. Arbeitet set‑basiert (bzw. mit Batch‑Cursor) und vermeidet SQL-Injection durch Escaping.
10ShowPopertiesNur für Diagnose/Entwicklung: Zeigt alle verfügbaren Eigenschaften einer ManagedEntityRowId an – hilfreich, um neue Property-Namen zu erkennen, wenn SCOM Management Packs aktualisiert werden.

3. Detaillierter Leseablauf (Datenfluss)

Die nachfolgende Grafik (textuell) veranschaulicht, wie die Daten von SCOM über die Views in die Kern-Tabellen gelangen:

[OperationsManagerDW] dtcSN (Zieldatenbank) 
│ │ 
├─ vManagedEntity ────────────► _01_InsertSQLServer ──► SQLServer 
│ │ _02_InsertComputer ───► Computer 
│ └─ _03_InsertSQLDatabases ────────────────► SQLDatabase 
│ 
├─ ManagedEntityProperty (XML) ──┬─ ReadPoperties (SQLServer) ───► SQLServer (Details) 
│ ├─ ReadPoperties (Computer) ────► Computer (Details) 
│ └─ ReadPoperties (SQLDatabase) ─► SQLDatabase (Details) 
│ 
└─ ManagedEntityTypeProperty (Metadaten zu Property-GUIDs) 

Schritt-für-Schritt:

  1. Initiale Extraktion der Basisdaten: _01_InsertSQLServer und _02_InsertComputer lesen über die Views die Grundinformationen (vollständiger Name, Pfad, Maschinenname, Domäne) und erkennen neue/verschwundene Objekte.
  2. Detailanreicherung: _01a_GetPropertiesForAllSQLEntries, _02a_GetpropertiesForAllComputerEntries und _03a_GetPropertiesForAllSQLDBS rufen für jede Zeile die Prozedur ReadPoperties auf, die das XML-Property-Feld parst und die einzelnen Attribute (z. B. Edition, Version, ServicePackVersion) aktualisiert.
  3. Nachbearbeitung: SetCaseSensitiv harmonisiert Pfade; _02b_GetWindowsOSForAllComputerEntrys liefert das Betriebssystem.

Alle Schritte sind als inkrementelle Synchronisation ausgelegt: Einmal geladene Objekte werden bei jedem Lauf aktualisiert, nicht mehr vorhandene werden über NotFoundSince als „verschwunden“ markiert.

4. Fokus: Die Prozedur ReadPoperties

Diese Prozedur ist das Herzstück der Detailanreicherung. Sie wird mit einer @ManagedEntityRowId und einem @Target-Tabellennamen aufgerufen.

🔧 Funktionsweise (verbesserte Version):
  • Sie prüft, ob die Ziel-Tabelle existiert.
  • Aus der SCOM-Property-XML (Spalte PropertyXML in vManagedEntityProperty) extrahiert sie alle Property-GUIDs und die zugehörigen Werte.
  • Über einen JOIN mit vManagedEntityTypeProperty werden die systeminternen GUIDs in lesbare PropertySystemName (z. B. Edition, Version) übersetzt.
  • Nur Properties, die als Spalten in der Ziel-Tabelle existieren, werden übernommen.
  • Das Update erfolgt set-basiert in Batches (je 100 Zeilen) – dadurch wird ein Cursor über alle Zeilen vermieden, die Performance erhöht und das Transaktionslog geschont.
  • Um SQL-Injection zu verhindern, werden einfache Anführungszeichen in den Property-Werten escaped ('').
  • Nach dem Update wird Modified auf die aktuelle Uhrzeit gesetzt.

Die ursprüngliche Version aus dem Legacy-Skript arbeitete zeilenweise mit einem Cursor. Die verbesserte Fassung nutzt STRING_AGG und temporäre Batch-Tabellen, was die Laufzeit bei tausenden Entities drastisch reduziert.

5. Diagnose-Hilfe: ShowPoperties

Mit dieser Prozedur können Sie für eine beliebige ManagedEntityRowId aus SCOM alle vorhandenen Properties in lesbarer Form anzeigen:

EXEC dbo.ShowPoperties 1359226; -- fiktive RowId

Die Ausgabe enthält Spalten wie PropertySystemName und den aktuellen PropertyValue. Dies ist besonders nützlich, wenn:

  • Ein neues SCOM Management Pack installiert wurde und zusätzliche Property-Namen verfügbar sind.
  • Sie die Tabelle SQLServer um eine neue Spalte erweitern möchten (siehe Abschnitt 6).
  • Fehler bei der Zuordnung auftreten – Sie sehen sofort, ob ein Property überhaupt geliefert wird.
💡 Tipp: Führen Sie ShowPoperties auf einer repräsentativen Instanz aus, um die exakten Property-Namen zu ermitteln (z. B. Edition oder VmMaxCpuPercent). Diese Namen müssen später als Spalten in den Kern-Tabellen vorhanden sein.

6. Erweiterung der Kern-Tabellen um neue Properties

Wenn SCOM durch ein Update oder ein neues Management Pack zusätzliche Eigenschaften für SQL Server, Computer oder Datenbanken liefert, können Sie diese einfach in dtcSN ergänzen, ohne die Prozeduren grundlegend ändern zu müssen.

Vorgehen in drei Schritten:

  1. Ermittlung des Property-Namens: Rufen Sie ShowPoperties für eine Beispiel-Entity auf und notieren Sie den gewünschten PropertySystemName (z. B. BackupDirectory).
  2. ALTER TABLE – fügen Sie eine neue Spalte mit passendem Datentyp (meist nvarchar(4000) oder varchar(256)) hinzu:
    ALTER TABLE dbo.SQLServer ADD BackupDirectory nvarchar(4000) NULL;
  3. Update der Prozeduren: In _01a_GetPropertiesForAllSQLEntries (oder der entsprechenden a-Prozedur für Computer/Datenbanken) muss die neue Spalte im UPDATE-Block ergänzt werden:
    ... 
    T.BackupDirectory = CASE WHEN P.PropertySystemName = 'BackupDirectory' THEN P.PropertyValue ELSE T.BackupDirectory END, 
    ...
    Die Prozedur ReadPoperties benötigt keine Anpassung, da sie dynamisch alle vorhandenen Spalten der Ziel-Tabelle abgleicht.

Die gleiche Technik gilt für Computer und SQLDatabase. Achten Sie darauf, den Property-Namen exakt so zu schreiben, wie er von SCOM geliefert wird (Groß-/Kleinschreibung beachten).

7. SQL-Agent-Job: Ausführungsreihenfolge

Für den nächtlichen (oder stündlichen) Synchronisationslauf wird ein SQL-Agent-Job empfohlen. Die Schritte müssen zwingend in der unten stehenden Nummerierung ablaufen, da spätere Prozeduren auf Ergebnissen früherer aufbauen.

-- ============================================================ 
-- SQL-Agent-Job "dtcSN_Synchronisation" 
-- Ausführung täglich um 02:00 Uhr (Beispiel) 
-- ============================================================ 
 
-- Schritt 1: SQL Server Grunddaten erfassen 
EXEC dbo._01_InsertSQLServer; 
 
-- Schritt 2: SQL Server Details (Properties) laden 
EXEC dbo._01a_GetPropertiesForAllSQLEntries; 
 
-- Schritt 3: Windows-Computer aus SQL Server-Kontext ermitteln 
EXEC dbo._02_InsertComputer; 
 
-- Schritt 4: Computer-Details (Properties) laden 
EXEC dbo._02a_GetpropertiesForAllComputerEntries; 
 
-- Schritt 5: Betriebssystem-Informationen ergänzen 
EXEC dbo._02b_GetWindowsOSForAllComputerEntrys; 
 
-- Schritt 6: Datenbank-Basisinformationen extrahieren 
EXEC dbo._03_InsertSQLDatabases; 
 
-- Schritt 7: Datenbank-Details (Properties) laden 
EXEC dbo._03a_GetPropertiesForAllSQLDBS; 
 
-- Schritt 8: Pfad-Korrektur (Case-Sensitivität) 
EXEC dbo.SetCaseSensitiv; 
 
-- Optional: Tägliches Logging / Reporting 
-- SELECT COUNT(*) FROM SQLServer WHERE NotFoundSince IS NULL; ... 
⏱️ Laufzeithinweis: Die Schritte 2, 4 und 7 benötigen je nach Anzahl der Instanzen/Computer/Datenbanken einige Minuten. Planen Sie den Job in Zeiten geringer Auslastung. Der Batch-Modus (Batches à 100) verhindert eine Überlastung der SCOM-Views.

8. Häufige Probleme & Lösungen

ProblemMögliche UrsacheLösung
Keine Daten in SQLServerManagedSQLEntityType ist leer oder enthält falsche ManagedEntityTypeRowId.Prüfen Sie mit SELECT DISTINCT ManagedEntityTypeRowId, ManagedEntityTypeSystemName FROM vManagedEntityTypeAll die vorhandenen Typen und tragen Sie die richtigen ein.
Properties werden nicht aktualisiert (NULL)Spaltenname in der Ziel-Tabelle weicht vom PropertySystemName ab.Mit ShowPoperties den exakten Namen ermitteln und ggf. die Spalte umbenennen.
Timeout oder langsamer LaufFehlende Indizes auf ManagedEntityRowId in den Kern-Tabellen.Indizes aus dem Bereitstellungsskript nachträglich anlegen (siehe IX_SQLServer_ManagedEntityRowId etc.).
Doppelte Einträge in ComputerEin Computer hostet mehrere SQL-Instanzen.Die Prozedur _02_InsertComputer enthält bereits eine Duplikatsbereinigung (ROW_NUMBER()). Sollten dennoch Dubletten auftreten, führen Sie das Skript erneut aus.
Keine Berechtigung auf OperationsManagerDWDer SQL-Agent oder der Benutzer SLAReporting hat nur Leseberechtigung auf die DW-Tabellen.Mindestens SELECT auf die Views vManagedEntity, ManagedEntityProperty und ManagedEntityTypeProperty erforderlich.

9. Fazit & Ausblick

Das dtcSN-Framework stellt eine robuste, erweiterbare Brücke zwischen SCOM und unternehmensinterner SQL-Dokumentation dar. Durch die klare Trennung von Basisdaten, Detail-Properties und manuellen Steuertabellen lässt es sich an nahezu jede SCOM-Umgebung anpassen. Die Verwendung von Batches, gezielten Indizes und einer durchdachten Fehlerbehandlung (eigene ErrorLog-Tabelle) macht die Lösung produktionsreif.

In Zukunft könnten zusätzliche Module ergänzt werden (z. B. Analyse von SQLDatabase-Größen, automatische Alerting bei ablaufendem Support, oder Integration in ein CMDB). Der modulare Aufbau der Prozeduren erlaubt es, einzelne Komponenten zu erweitern, ohne das Gesamtsystem zu gefährden.


© 2026 – dtc-sql.de | Skriptversion 2.0 – Verbesserte Batches, Indizes und Fehlerbehandlung