NIENKERKE CONSULTING GmbH Über uns Leistungen Qualität Kontakt

Für mehr Qualität in (Microsoft) Daten-Projekten

Damit ist nicht Daten-Qualität gemeint. Daten-Qualität wird bei der Erzeugung der Daten durch ein verändertes Bewusstsein für die Daten und das Anpassen der entsprechenden Prozesse erreicht.

Gemeint ist die Qualität des Entwicklungsprozesses in Daten-Projekten. Diese schafft wiederholbar stabile und verlässliche Ergebnisse und damit Vertrauen und Akzeptanz bei den Konsumenten der Daten-Produkte.

Standardisierung ist die Voraussetzung für Automatisierung. Und Automatisierung ermöglicht wiederholbar gleichbleibende Qualität zu liefern. Mit verschiedenen einzelnen Maßnahmen, lässt sich die Qualität des gesamten Entwicklungsprozesses nachhaltig steigern.

SQL-Datenbankprojekte

SQL-Datenbankprojekte

Der App-Source-Code liegt sicher verwahrt in der Source-Code-Verwaltung. Was ist mit der SQL-Datenbank? Lose Skript-Sammlung oder nur eine operative Datenbankinstanz? Welche Skripte sind aktuell? Was passiert, wenn die Datenbankinstanz beschädigt wird oder verloren geht? Wie können Änderungen vorgenommen werden ohne dabei unbemerkt Fehler an anderen Stellen einzubauen?

Hier helfen SQL-Datenbankprojekte. Egal ob operative Datenbank oder Data Warehouse, die gesamte Struktur der SQL-Datenbank (Tabellen, Sichten, gespeicherte Prozeduren, etc.) wird in Form einzelner SQL-Objekte in einem SQL-Datenbankprojekt verwaltet. Dadurch kann die Datenbank ebenfalls als Quellcode in einer Versionsverwaltung abgelegt und mit CI/CD-Pipelines automatisch in verschiedenen Umgebungen bereitgestellt werden.

Übersicht

  • Entwicklung mit entsprechenden Erweiterungen in Visual Studio oder Visual Studio Code einschließlich Versionierung des Quellcodes über beispielsweise Git
  • T-SQL-Code zur Definition jedes einzelnen Datenbankobjektes
  • Erstellen des Projektes prüft die Syntax entsprechend der Zielplattform sowie die Verweise zwischen den Objekten und erzeugt als Ausgabe eine .dacpac Datei
  • Bereitstellung (z.B. mit SqlPackage-Tool) gleicht eine evtl. vorhandene Datenbank mit dem Projekt ab und erzeugt nur ein Upgrade-Skript um notwendige Änderungen durchzuführen
  • SQL-Datenbankprojekt ist "Single Source of Truth" des Datenbankschemas

Projekttypen

  • Ursprüngliches Projektformat basierend auf MSBuild (.NET Framework) wird von den SQL Server Data Tools (SSDT) in Visual Studio verwendet
  • Neueres Projektformat im SDK-Stil basierend auf .NET Core SDK-Formatprojekten wird von der SQL Database Projects Extension für Visual Studio Code verwendet
  • Die Unterstützung für SDK-Stil Projekte in Visual Studio befindet sich in Preview
  • SDK-Stil Projekte bilden die Obermenge der unterstützten Features mit Ausnahme von SQLCLR-Objekten, die .NET Framework erfordern
  • Ursprüngliche SQL-Projekte können in SDK-Stil Projekte konvertiert werden

Zum ausführlichen Vergleich der Feature-Sets auf Microsoft Learn.

Vorgehensweise

  • Neues Projekt anlegen ODER aus vorhandener Datenbank erstellen ODER aus Fabric herunterladen
  • Optional Datenbank importieren (nur bei neuem Projekt) oder Schemavergleich
  • Neue Datenbank-Objekte hinzufügen, vorhandene ändern oder löschen
  • Datenbank-Projekt erstellen - 0 Warnings sollte der Qualitätsanspruch sein, Errors verhindern eine Bereitstellung
  • Datenbank-Projekt auf der Zielplattform bereitstellen

Walk-Through: Fabric Warehouse in VS Code mit SQL Database Projects Extension

Fabric Lakehouse und Fabric Warehouse sind zwar besonders, da sie nur einen SQL Analytics Endpoint bereitstellen und intern mit Parquet-Dateien arbeiten. Aber auch diese Objekte lassen sich in einem SQL Datenbank Projekt verwalten, wobei bestimmte Einschränkungen zu berücksichtigen sind.

Für dieses Beispiel haben wir vorab in Fabric ein Warehouse "SampleDWH" erstellt und mit den Beispieldaten von Microsoft beladen.

1. Projekt aus Datenbank erstellen

Create Project From Database

In VS Code (SQL Database Projects Extension) können wir das Schema des Warehouses über das Feature "Create Project From Database" importieren.

2. Datenbank-Objekt ändern

Bearbeiten der View

Da wir für eine detailliertere Analyse zusätzliche Kennzahlen benötigen, erweitern wir die View "vw_PaymentAnalysis" um die noch fehlenden Spalten.

3. Projekt erstellen

Fehler im Buildvorgang

Das Erstellen des Projekts gibt uns sofort die Rückmeldung, dass wir einen Fehler in unserem Source-Code haben. Es gibt ein Problem mit einer der neu hinzugefügten Spalten in der bearbeiteten View. Die referenzierte Spalte [TollAmount] kann nicht aufgelöst werden.

Nach kurzer Prüfung ist klar, wir haben einen Tippfehler. Der Spaltenname wird zu [TollsAmount] korrigiert und die erneute Erstellung des Projekts ist erfolgreich.

4. Datenbank bereitstellen

Datenbank bereitstellen

Abschließend können wir das geänderte Datenbank Schema auf der Zielplattform bereitstellen.

Dazu müssen wir zunächst eine Verbindung zur Zielplattform herstellen. Durch einen Abgleich zwischen dem Schema im SQL Projekt und der Datenbank-Instanz werden die Unterschiede identifiziert.

Die notwendigen Änderungen können wir entweder als SQL Statements in einem Skript generieren lassen, das wir anschließend manuell gegen die Datenbank-Instanz ausführen. Oder wir veröffentlichen die Änderungen direkt.

Schauen wir anschließend in Fabric mit dem Explorer in das Warehouse Schema, sehen wir die neu hinzugefügten Spalten.

Alle Informationen zu SQL-Datenbankprojekten gibt es auf Microsoft Learn.

Quellcodeverwaltung und Versionskontrolle

Quellcodeverwaltung

Du entwickelst auf der Produktivumgebung oder hast zwar eine Entwicklungsumgebung aber immer nur den aktuellen Entwicklungsstand?

Was, wenn diese eine Version versehentlich gelöscht wird oder der Admin ein Backup vom Server einspielen muss und damit einen alten Stand wiederherstellt? Wie kommst Du zu einem lauffähigen Entwicklungsstand zurück, wenn eine Deiner letzten Änderungen zu einem Fehler an ganz anderer Stelle geführt hat und das erst eine Woche später aufgefallen ist? Wie hältst Du den Überblick über unzählige Kopien und Zwischenstände Deiner Entwicklungsarbeit?

Was das Backup für die Datenbank ist, ist die Versionskontrolle für Deine Entwicklung! Diese hilft Dir, Deine Entwicklungsarbeit zu sichern und zu versionieren, auch im Team. Die Nachverfolgung aller Änderungen ist problemlos möglich und jederzeit kannst Du auf einen älteren Entwicklungsstand zurückgreifen.

Entwicklung mit Netz und doppeltem Boden!

Übersicht

  • Die zu entwickelnden Objekte sollten in einer Form von Quellcode-Dateien vorliegen
  • Binär-Dateien sind grundsätzlich möglich, aber nur mit eingeschränkter Funktionalität
  • Objekte können lokal oder in einem eigenen isolierten Arbeitsbereich entwickelt werden
  • Alle Änderungen werden zentral in einer gemeinsamen Quellcode-Basis verwaltet
  • Ermöglicht automatisches Erstellen und Testen (Continuous Integration)

Szenarien und Vorgehensweise

Bei Entwicklungsprozessen, die auf einer gemeinsamen zentralen Umgebung aufsetzen, wie beispielsweise einem Fabric-Arbeitsbereich, muss darauf geachtet werden, dass sich Entwickler nicht gegenseitig in ihrer Arbeit stören. Grundsätzlich lassen sich zwei Szenarien unterscheiden.

Lokale Entwicklung mit Client-Tools

  • Nur für Objekte, die in Client-Tools (z.B. Power BI Desktop) verfügbar bzw. bearbeitbar sind
  • Klonen des zentralen Repository in ein lokales Repository
  • Entwickeln auf dem lokalen Computer und Sichern der Entwicklungsarbeit im lokalen Repository
  • Übertragen der Änderungen aus dem lokalen Repository in das zentrale Repository

Entwicklung in isoliertem Arbeitsbereich

  • Objekte, die beispielsweise nur in Fabric verfügbar sind und dort entwickelt werden können
  • Erstellen eines Feature-Branch im zentralen Repository
  • Verknüpfen des Feature-Branch mit einem isolierten Arbeitsbereich
  • Entwickeln im eigenen isolierten Arbeitsbereich und Sichern der Entwicklungsarbeit im Feature-Branch
  • Übertragen der Änderungen aus dem Feature-Branch in den Main-Branch

Alle Informationen zu Microsoft Fabric-Git-Integration gibt es auf Microsoft Learn.

Automatisiertes Deployment

Deployment

Das neue Feature ist implementiert. Die DWH-Datenbank ist erweitert. Der Lade-Prozess ist angepasst. Wie bekommst Du die Änderungen zuerst in die Test-Umgebung, damit der Fachbereich sie dort testen kann? Und wie kommen später nur diese getesteten Änderungen in die Produktiv-Umgebung?

Deine Bereitstellung ist jedes Mal ein Eier-Tanz? Du spielst Änderungen manuell in die Ziel-Umgebung und musst regelmäßig nacharbeiten? Du sammelst vor jeder Bereitstellung einen Berg von Änderungsskripten?

Deployment Pipelines sind der standardisierte Prozess, Deine neuen Features automatisiert in der Ziel-Umgebung bereitzustellen!

Ein standardisierter und automatisierter Prozess ohne fehleranfällige manuelle Schritte. Egal, ob Entwicklungs-, Test- oder Produktiv-Umgebung, alle Umgebungen werden gleich bereitgestellt. Keine manuellen Skripte mehr, da nur bereitgestellt wird, was in der Quellcode-Verwaltung liegt.

Übersicht

Deployment Pipelines ermöglichen eine standardisierte Automatisierung. Alle Deine Ziel-Umgebungen können auf die gleiche Weise bereitgestellt werden. Du kannst sicher sein, dass keine Änderung in die Produktiv-Umgebung gelangt, die nicht vorher auch in der Test-Umgebung zum Testen bereit stand.

  • Ein definierter Entwicklungsstand aus der Quellcode-Verwaltung wird verwendet
  • Gegebenenfalls werden Deployment-Artefakte erstellt
  • Jedes Objekt wird nach einem genau festgelegten Ablauf in der Ziel-Umgebung bereitgestellt
  • Zusätzliche Schritte, wie z.B. spezifische Konfigurationen oder Testdurchführung, können integriert werden

Optionen

Es gibt verschiedene Optionen. Abhängig von den Rahmenbedingungen im Projekt passt nicht nur die eine oder die andere, sondern es ist auch eine Kombination aus mehreren Optionen möglich.

Azure Pipelines

  • Teil von Azure DevOps
  • Automatisiertes Erstellen, Testen und Bereitstellen verschiedener Projekttypen auf unterschiedlichen Ziel-Plattformen
  • Benötigt Quellcode-Verwaltung
  • Sehr umfangreiche Möglichkeiten und mit eigenen Skripten erweiterbar
  • Kann verwendet werden, um Fabric Deployments mittels API-Aufrufen zu orchestrieren oder zu starten

Alle Informationen zu Azure Pipelines gibt es auf Microsoft Learn.

Git-basiertes Deployment (Fabric)

  • Jeder Fabric Ziel-Workspace (Entwicklung, Test, Produktiv) basiert auf einem eigenen Git-Branch
  • Nur aus dem entsprechenden Git-Branch wird der jeweilige Fabric Workspace aktualisiert
  • Die Aktualisierung des Fabric Workspace erfolgt durch Aufrufe der Fabric Git API
  • Neue Features und Änderungen werden nur zwischen den Git-Branches in die nächste Stufe transportiert
Deployment

Git-basiertes Deployment mit Build-Umgebungen (Fabric)

  • Alle Fabric Ziel-Workspaces basieren auf nur einem gemeinsamen Git-Branch
  • Für jedes Bereitstellungs-Ziel wird zunächst eine eigene Build-Umgebung erstellt
  • In der Build-Umgebung können Tests durchgeführt und die Konfiguration angepasst werden
  • Die Elemente aus der Build-Umgebung werden durch Aufrufe der Fabric API in den Ziel-Workspace geladen
Deployment

Fabric Deployment Pipelines

  • Nur der Entwicklungs-Workpace basiert direkt auf einem Git-Branch
  • Eine Build Pipeline startet die Aktualisierung des Workspace durch Aufrufe der Fabric Git API
  • Zwischen den Fabric Workspaces erfolgt die Bereitstellung durch eine Fabric Deployment Pipeline
  • Die einzelnen Stages der Fabric Deployment Pipeline werden durch die Build Pipeline und entsprechende API Aufrufe angestoßen
Deployment

Alle Informationen zu Fabric CI/CD-Workflowoptionen sowie die Bild-Quelle gibt es auf Microsoft Learn.

Fabric Default Power BI Semantic Model

Deployment

Bei der Erstellung eines Warehouse oder Lakehouse erstellt Fabric automatisch auch ein Default Power BI Semantic Model. Erkennbar am Suffix "(default)" in der Typbezeichnung.

Das Default Semantic Model erbt die Objekte und Beziehungen aus dem zugehörigen Warehouse bzw. dem SQL Analytics Endpoint des Lakehouse und soll dadurch die direkte Darstellung und Analyse der enthaltenen Daten in Power BI in nur wenigen Schritten ermöglichen.

Das klingt auf den ersten Blick vielversprechend! Aber wie gut ist das Default Semantic Model wirklich? Was können wir automatisiert erstellen lassen und wo müssen wir manuell nacharbeiten?

Übersicht

  • Warehouse oder Lakehouse erstellen
  • Tabellen/Sichten für das Default Semantic Model auswählen oder das Default Semantic Model automatisch aktualisieren lassen
  • Optional das Default Semantic Model anpassen und erweitern
  • Verwendung des Models in Power BI

Standardmäßig werden Warehouse und Default Semantic Model nicht automatisch synchronisiert. Im Warehouse neu hinzugefügte Objekte müssen manuell in das Modell aufgenommen werden.

Die automatische Synchronisierung kann über die Warehouse Einstellungen konfiguriert werden. Dadurch wird ein Hintergrundprozess angestoßen, der OneLake-Nutzungskosten verursacht.

Wie gut ist das Default Power BI Semantic Model im Fabric Warehouse?

Für diesen Versuch erstellen wir in Fabric ein Warehouse und beladen es mit den Beispieldaten von Microsoft. Dadurch wird automatisch ein gleichnamiges Default Power BI Semantic Model erzeugt.

Warehouse erstellen und mit Beispieldaten beladen

1. Versuch

Erster Versuch

Bevor wir einen Report erstellen können, müssen wir definieren, welche Objekte in das Default Semantic Model aufgenommen werden sollen. Es können alle Tabellen und Sichten in das Modell übernommen werden oder nur ausgewählte.

Wir wählen nur Tabellen und erhalten ein sofort in Power BI verwendbares Modell.

Der erste Report ist allerdings weniger überzeugend. In jedem Monat derselbe Umsatz lässt vermuten, dass Beziehungen fehlen oder falsch sind.

Erster Bericht

Ein Blick in das Default Semantic Model bestätigt unsere Vermutung. Es existieren keinerlei Beziehungen zwischen den Tabellen.

Fehlende Beziehungen

2. Versuch

Bearbeiten der View

Per SQL legen wir Primary-Keys in den Dimensions-Tabellen und Foreign-Key-Beziehungen von der Fakten-Tabelle zu den Dimensions-Tabellen an. Dadurch werden automatisch die logischen Beziehungen im Default Semantic Model synchronisiert.

Ob die Beziehungen im Warehouse per SQL erstellt oder im Default Semantic Model per Drag-and-Drop modelliert werden, ist tatsächlich nicht wichtig. Fabric hält beide Definitionen synchron.

Da wir das Default Semantic Model ohne manuelle Nacharbeiten möglichst weit bringen wollen, definieren wir die Beziehungen per SQL. Dies könnte beispielsweise auch über ein SQL Database Project erfolgen.

Die doppelt vorhandenen Beziehungen zwischen der Fakten-Tabelle und zwei Dimensions-Tabellen irritieren noch, aber dieses Modell liefert schon einmal plausiblere Werte.

Erster Bericht

3. Versuch

Fehler im Buildvorgang

Um die doppelten Beziehungen loszuwerden und erweiterte Auswertungsmöglichkeiten im Modell bereitzustellen, legen wir per SQL für jede Role-Playing-Dimension eine eigene View auf die Dimensions-Tabelle an.

Anschließend müssen noch die Primary- und Foreign-Keys angepasst und die neuen Views ins Default Model übernommen werden.

Damit erhalten wir tatsächlich ein sauberes Star-Schema in unserem Default Power BI Semantic Model, das so alleine mit der Definition in SQL sofort in Power BI einsetzbar ist und per Direct Lake Mode auf die Daten zugreift.

Die Bezeichnungen für Tabellen und Spalten werden aus dem Warehouse geerbt und grundsätzlich sind alle Spalten erst einmal sichtbar. Um das Modell anwenderfreundlicher zu gestalten und z.B. technische Spalten auszublenden oder Hierarchien und Measures hinzuzufügen, muss das Modell weiter bearbeitet werden.

Row-Level-Security wird im Default Semantic Model nicht unterstützt. Dazu muss ein separates Semantic Model angelegt werden, das dann aber nicht mehr mit dem Warehouse oder SQL Analytics Endpoint des Lakehouse verbunden ist.

Learnings

Die Idee war, ein Fabric Warehouse per SQL soweit vorzubereiten, dass das automatisch generierte Default Semantic Model möglichst ohne weitere oder zumindest nur mit sehr wenigen manuellen Schritten sofort einsatzbereit ist.

Herausgestellt hat sich:

  • Ohne definierte Beziehungen zwischen den Tabellen im Warehouse ist das Default Semantic Model nicht sofort zu gebrauchen.
  • Für sehr einfache Anwendungsfälle lässt sich eventuell ein ausreichendes Default Semantic Model vorbereiten, welches gegebenenfalls manuell noch angepasst werden muss. Aber spätestens bei der Notwendigkeit für Row-Level-Security oder komplexeren Berechnungen muss ein separates Semantic Model erstellt werden.
  • Je besser die dimensionale Modellierung im Warehouse, desto leichter und schneller läuft die weitere Entwicklung im Power BI Semantic Model.

Alle Informationen zum Default Power BI Semantic Model gibt es auf Microsoft Learn.

Copyright 2025 by NIENKERKE CONSULTING GmbH