Snowflake Trick 1 * PRIMARY KEY Metadata persistieren
Einleitung
In vielen datengetriebenen Projekten ist ein präzises Verständnis der zugrunde liegenden Datenstrukturen unerlässlich. Insbesondere Informationen zu Primärschlüsseln sind dabei von zentraler Bedeutung – etwa zur Sicherstellung von Datenqualität, zur Ableitung von Entity-Relationship-Diagrammen oder zur Validierung gegen definierte Modellstandards.
Doch genau hier stößt man bei Snowflake schnell an eine Grenze: Das INFORMATION_SCHEMA bietet keine Möglichkeit, auf die referenzierten Attribute von Primärschlüsseln zuzugreifen. Die einzige verfügbare Methode ist der SHOW PRIMARY KEYS-Befehl – allerdings liefert dieser seine Ergebnisse nicht in tabellarischer Form, sondern nur als Session-Ausgabe.
Dieses Defizit behindert zentrale Aufgaben wie:
- Automatisierte Duplikatsprüfungen, bei denen SQL-Dynamik basierend auf Primärschlüsseln generiert wird
- Erstellung von Entity-Relationship-Diagrammen (ERD) auf Basis von Primär- und Fremdschlüsselinformationen
- Validierung technischer Implementierung gegen ein Modell oder definierte Soll-Vorgaben
In diesem Artikel zeigen wir, wie man diese Lücke mithilfe eines einfachen, aber effektiven Scripts schließen kann: Die Ergebnisse des SHOW PRIMARY KEYS-Befehls werden extrahiert, in einer persistenten Tabelle gespeichert und stehen damit für jede Form automatisierter Weiterverarbeitung zur Verfügung.
Sql
DECLARE DB STRING; DECLARE SQL_COMMAND STRING;
-- Hole den aktuellen Datenbanknamen
SELECT CURRENT_DATABASE() INTO :DB;
-- Baue den SHOW-Befehl dynamisch zusammen
LET SQL_COMMAND = 'SHOW PRIMARY KEYS IN DATABASE ' || :DB;
-- Führe den dynamischen SQL-Befehl aus
EXECUTE IMMEDIATE :SQL_COMMAND;
-- Persistiere das Ergebnis in einer Tabelle
CREATE OR REPLACE TABLE PRIMARY_KEY_COLUMNS
AS
SELECT "created_on" AS created_on, "database_name" AS database_name, "schema_name" AS schema_name,
"table_name" AS table_name, "column_name" AS column_name, "key_sequence" AS key_sequence,
"constraint_name" AS constraint_name, "rely" AS rely, "comment" AS comment
FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()));
Technischer Hintergrund und Nutzen des Scripts
Das vorgestellte Script nutzt eine einfache, aber effektive Technik, um Informationen zu Primärschlüssel-Definitionen aus der Snowflake-Metadatenstruktur zu extrahieren und dauerhaft verfügbar zu machen.
Da SHOW PRIMARY KEYS nicht direkt über das INFORMATION_SCHEMA zugänglich ist und keine SQL-kompatible Ergebnistabelle liefert, greifen wir auf eine Kombination aus EXECUTE IMMEDIATE und RESULT_SCAN(LAST_QUERY_ID()) zurück. Damit können wir die Ausgabe des Kommandos in eine persistente Tabelle überführen.
Schritte im Überblick
- Ermitteln der aktuellen Datenbank
Über SELECT CURRENT_DATABASE() wird ermittelt, auf welcher Umgebung (z.B. DEV, UAT, PROD) das Skript aktuell läuft.
- Dynamischer Aufbau des SHOW-Befehls
Anstatt jede Umgebung einzeln im Code zu behandeln, wird der Befehl per String-Konkatenation aufgebaut und dann mit EXECUTE IMMEDIATE ausgeführt. So bleibt das Skript universell einsetzbar.
- Persistieren der Ergebnisdaten
Mit RESULT_SCAN(LAST_QUERY_ID()) lesen wir das Ergebnis des SHOW-Befehls aus und speichern es in einer Tabelle PRIMARY_KEY_COLUMNS. Damit stehen die Informationen dauerhaft und auswertbar zur Verfügung.
Nutzen in der Praxis (mit Beispielen)
Durch die tabellarische Persistenz der Primärschlüssel-Informationen ergeben sich mehrere direkte Vorteile:
✅ Automatisierte Duplikatsuche
Für Tabellen mit definiertem Primärschlüssel können SQL-Skripte generiert werden, die gezielt auf Duplikate prüfen – etwa zur Sicherstellung von Datenqualität oder zur Abnahme neuer Ladeprozesse.
Sql
-- Beispiel: Duplikate in einer Tabelle auf Basis ihres Primärschlüssels
SELECT table_name, column_name
FROM PRIMARY_KEY_COLUMNS
WHERE table_name = 'CUSTOMERS';
-- Ergebnis verwenden, um z. B. folgendes SQL dynamisch zu generieren:
SELECT customer_id, COUNT(*)
FROM CUSTOMERS
GROUP BY customer_id
HAVING COUNT(*) > 1;
✅ Modellbasierte Validierung
Die extrahierten Keys lassen sich mit fachlichen Modellvorgaben abgleichen (z. B. aus einem Data Vault oder 3NF-Modell), um technische Inkonsistenzen frühzeitig zu erkennen.
Sql
-- Vergleich mit Modell-Vorgaben aus einer Soll-Tabelle
SELECT pk.table_name, pk.column_name
FROM PRIMARY_KEY_COLUMNS pk
LEFT JOIN MODEL_DEFINITION md
ON pk.table_name = md.table_name AND pk.column_name = md.column_name
WHERE md.column_name IS NULL;
✅ Generierung eines ER-Diagramms
In Verbindung mit Foreign-Key-Informationen (die auf ähnliche Weise extrahiert werden können) können automatisch ER-Diagramme erstellt werden – z. B. als Input für Visualisierungstools oder Metadaten-Dokumentation.
Sql
-- Vorbereitung für ERD-Generierung: Alle PK-Spalten einer Tabelle
SELECT schema_name, table_name, column_name, constraint_name
FROM PRIMARY_KEY_COLUMNS;
-- Kombiniert mit ähnlichen Infos aus SHOW IMPORTED KEYS ergibt ein vollständiges ER-Modell
✅ Environments-übergreifend einsetzbar
Durch die Templatisierung läuft das Script ohne Anpassungen auf beliebigen Datenbanken. So lassen sich DEV-, UAT- und PROD-Umgebungen einheitlich überwachen.
Sql
-- Beispiel: Überblick über alle erfassten Primärschlüssel pro Umgebung
SELECT database_name, COUNT(DISTINCT table_name) AS anzahl_tabellen
FROM PRIMARY_KEY_COLUMNS
GROUP BY database_name;
Fazit und Ausblick
Die tabellarische Persistenz von Primärschlüsselinformationen in Snowflake ist ein einfacher, aber wirkungsvoller Schritt, um strukturelle Metadaten in automatisierte Prozesse zu integrieren. Ob zur Qualitätssicherung, Modellvalidierung oder Visualisierung – mit wenigen Zeilen SQL lassen sich Mehrwert und Transparenz schaffen, die im Alltag eines datengetriebenen Unternehmens entscheidend sein können.
Ein nächster logischer Schritt ist die systematische Erfassung von Foreign-Key-Definitionen, beispielsweise über den Befehl SHOW IMPORTED KEYS. Diese Informationen lassen sich analog persistieren und in Beziehung zu den bereits gespeicherten Primärschlüsseln setzen – etwa zur Generierung vollständiger Entity-Relationship-Diagramme, zur Navigation über Datenabhängigkeiten oder zur Ableitung semantischer Schichten.
Ein berechtigter Gedanke zum Schluss: Warum stellt Snowflake diese Informationen nicht direkt im INFORMATION_SCHEMA zur Verfügung?
Die Einschränkung wirkt technisch unnötig – gerade in einem Cloud-nativen Datenbanksystem, das sich ansonsten durch Transparenz, Skalierbarkeit und Automatisierbarkeit auszeichnet. Möglicherweise liegt der Grund in einem Architekturprinzip, das SHOW-Befehle als interaktive Benutzerabfragen versteht, nicht als vollwertige, systematische Metadatenquelle. Doch genau darin liegt eine Schwäche, die durch pragmatische Lösungen wie das hier vorgestellte Script behoben werden kann.