DCM Projects-Dateien und -Vorlagen

Ein|dcm-object| erfordert eine Manifestdatei und eine oder mehrere SQL Objektdefinitionsdateien. Diese Dateien werden normalerweise in einem Git-Repository oder Ihrem lokalen Arbeitsbereich gespeichert und verwaltet.

  • Manifest-Datei

    • Gibt an, welche Dateien mit Objektdefinitionen eingebunden werden sollen.

    • Definiert Konfigurationen für verschiedene Umgebungen mit Variablen der Vorlage.

  • Objektdefinitionsdateien

    • Definieren Sie eine Gruppe von Snowflake-Objekten, die Sie zusammen in DCM project verwalten möchten.

Der allgemeine Workflow zum Erstellen von DCM project-Dateien ist:

  1. Erstellen eines DCM project-Ordners zum Speichern Ihrer Definitionsdateien

  2. Manifest-Datei erstellen

  3. Erstellen von Objektdefinitionsdateien

Erstellen eines DCM project-Ordners zum Speichern Ihrer Definitionsdateien

Für ein neues DCM project erstellen Sie einen Ordner zum Speichern Ihrer Manifest-Datei (manifest.yml) und SQL Objektdefinitionsdateien.

snow init <project_name> --template DCM_PROJECT

Der Befehl snow init mit der DCM_PROJECT-Vorlage erstellt Beispieldefinitionsdateien in Ihrem Projektverzeichnis. Sie können diese Dateien öffnen und bearbeiten, um Ihr DCM project zu definieren.

DCM Projects folgen der standardisierten Ordnerstruktur:

  • DCM Projects-Objektdefinitionsdateien müssen unter sources/definitions/ platziert werden.

  • Die optionalen globalen Makrodateien können unter sources/macros/ platziert werden.

  • Die Benennung und Verschachtelung von Dateien innerhalb dieser Projektverzeichnisse ist flexibel.

  • Gespeicherte Ausgabeartefakte von DCM-Befehlen werden immer in out/ geschrieben.

  • Wenn Sie zusätzliche Skripte oder Projektdateien haben, die Sie für DCM-Befehle verwenden möchten, können Sie diese unter sources hinzufügen (z. B. dbt-Projektdateien).

  • Wenn Sie andere benutzerdefinierte Skripte haben, die Sie im Projektordner speichern möchten und die nicht von DCM Projects-Befehlen verwendet und nicht lokal hochgeladen werden sollen, fügen Sie diese in einem Ordner außerhalb der sources-Ordner hinzu.

  • Die CLI-Befehle laden nur Dateien innerhalb der sources-Ordner hoch.

Bemerkung

Wenn Sie Git verwenden, fügen Sie out/ zu Ihrer .gitignore-Datei hinzu, um zu vermeiden, dass lokale Ausgabedateien an Git übertragen werden.

Beispiel für eine DCM project-Ordnerstruktur:

my_dcm_project/
  ├── manifest.yml
  ├── sources/
  │   ├── definitions/
  │   │   ├── bronze.sql
  │   │   └── silver.sql
  │   ├── macros/
  │   │   └── global_macro.sql
  │   └── dbt/
  │       ├── my_dbt_project_1/
  │       └── my_dbt_project_2/
  ├── my_post_scripts/
  └── out/
      └── plan/

Manifest-Datei erstellen

Jedes DCM project erfordert eine manifest.yml-Datei. Sie enthält die wesentlichen Konfigurationsdetails des Projekts und ermöglicht es, den Projektordner als DCM project zu identifizieren.

Verwenden Sie die Manifest-Datei, um zu steuern, welche DCM project-Objekte und -Rollen bei der Bereitstellung in verschiedenen Zielumgebungen verwendet werden sollen und um Gruppen von Vorlagenwerten zu verwalten.

Die Manifest-Datei ist eine YAML-Datei, die die folgenden Eigenschaften enthält:

manifest_version: 2
type: DCM_PROJECT
default_target:
targets:
templating:

Eigenschaft

Erforderlich

Beschreibung

manifest_version

Erforderlich

Version des Manifest-Schemas. Die aktuelle Version ist 2.

type

Erforderlich

Typ des Projekts. Auf DCM_PROJECT setzen.

default_target

Optional

Wenn Sie mehr als ein Ziel haben, geben Sie das Standardziel an. Die Snowflake CLI und Arbeitsbereiche verwenden das Standardziel, wenn Sie kein Ziel über ein --target-Flag angeben.

targets

Erforderlich

Im Abschnitt targets wird jedes Bereitstellungsziel einem bestimmten Snowflake-Konto, DCM project-Objekt, einer Eigentümerrolle und optional einer Vorlagenkonfiguration zugeordnet. Durch diese Zuordnung ist es nicht mehr erforderlich, in jedem CLI-Befehl vollqualifizierte Projektnamen und Konfigurationsflags zu übergeben. Weitere Details dazu finden Sie unter Projektziele.

templating

Optional

Im Abschnitt templating werden die Vorlagenkonfigurationen definiert, die für das Projekt verwendet werden sollen. Weitere Details dazu finden Sie unter Konfiguration von Projektvorlagen.

Projektziele

Jedes Ziel in der Manifest-Datei enthält die folgenden Eigenschaften:

targets:
  <target_name>:
    account_identifier:
    project_name:
    project_owner:
    templating_config:

Eigenschaft

Beschreibung

account_identifier

Der Bezeichner des Snowflake-Kontos für dieses Ziel.

Siehe Ermitteln von Region und Locator eines Kontos.

project_name

Der vollqualifizierte Name des DCM project-Objekts, z. B. DCM_DEMO.PROJECTS.DCM_PROJECT_DEV.

Verwenden Sie den SQL-Befehl SHOW DCM PROJECTS, um ihn zu finden.

project_owner

Die Rolle mit OWNERSHIP für dieses Projektobjekt.

Verwenden Sie den SQL-Befehl SHOW DCM PROJECTS oder DESCRIBE DCM PROJECT, um ihn zu finden.

templating_config (optional)

Der Name der im Abschnitt templating definierten Vorlagenkonfiguration, die für dieses Ziel verwendet werden soll.

Projektdefinitionen und Projektobjekten zuordnen

DCM Projects-Definitionsdateien sind nicht streng an ein bestimmtes DCM project-Objekt gebunden. Sie können denselben Satz von Definitionen für die Bereitstellung in mehreren Projekten verwenden, entweder in verschiedenen Snowflake-Konten oder indem Sie auf verschiedene Konfigurationsprofile verweisen. Zum Beispiel können dieselben Definitionsdateien in einem Repository-Zweig in DEV- und PROD-Konten bereitgestellt werden, wie in der folgenden Abbildung gezeigt.

DCM-Definitionen zu DCM-Projektobjekten

Auf ähnliche Weise können Sie ein DCM Projects-Objekt ausführen, indem Sie auf Definitionsdateien aus verschiedenen Pfaden verweisen. Zum Beispiel kann IhreCI/CD-Automatisierung Definitionen aus Ihrem Hauptzweig bereitstellen, und Sie können einen PLAN aus Ihren lokalen Definitionsdateien für dasselbe Projekt manuell ausführen, um zu prüfen, wie sich Ihre Definitionen von der letzten Bereitstellung unterscheiden. Sie können diesen Ansatz auch für manuelle Ad-hoc-Bereitstellungen von anderen Zweigen oder lokalen Pfaden verwenden.

Konfiguration von Projektvorlagen

Im Folgenden sehen Sie die allgemeine Struktur der Vorlagenkonfiguration in der Manifest-Datei. Sie können entweder nur defaults oder nur configurations oder beides einstellen.

templating:
  defaults:
    <variable_name>: <value>
  configurations:
    <configuration_name>:
      <variable_name>: <value>

Eigenschaft

Beschreibung

defaults

Die Werte der gemeinsam genutzten Variablen in Schlüssel-Wert-Paaren, die für alle Konfigurationen gelten, um Wiederholungen zu vermeiden.

configurations

Die für das Projekt zu verwendenden Vorlagenkonfigurationen.

Einzelne Konfigurationen können Standardwerte mit konfigurationsspezifischen Werten überschreiben. Weitere Informationen dazu, wie Variablen aufgelöst werden, finden Sie unter :ref:` Konfigurationen<label-dcm_projects_configurations>`.

<configuration_name>

Der Name der Vorlagenkonfiguration.

Bei Konfigurationsnamen wird Groß-/Kleinschreibung nicht berücksichtigt.

<variable_name>

Der Name der Variablen.

Variablennamen sollten den ` Regeln für die Benennung von Python-Variablen<https://www.w3schools.com/python/python_variables_names.asp>`_ folgen.

Alle Variablen in Projektdefinitionen müssen entweder in den Standardeinstellungen, in der ausgewählten Konfiguration oder zur Laufzeit deklariert werden.

Wenn Sie möchten, dass Zeichenfolgenvariablen leer aufgelöst werden, geben Sie diese als "" an.

<value>

Der Wert der Variablen.

Werte können Zeichenfolgen, Zahlen, Boolesche Werte, Listen oder Wörterbücher sein.

Wörterbücher können im Manifest definiert, aber zur Laufzeit nicht überschrieben werden.

Beispiel: manifest.yml

Dies ist ein Beispiel für eine DCM project-Manifest-Datei (manifest.yml), die drei Konfigurationen enthält: DEV, STAGE und PROD mit Vorlagenvariablen und deren Standardwerten:

manifest_version: 2

type: DCM_PROJECT

default_target: DCM_DEV

targets:
  DCM_DEV:
    account_identifier: MYORG-MYACCOUNT_DEV
    project_name: DCM_DEMO.PROJECTS.DCM_PROJECT_DEV
    project_owner: DCM_DEVELOPER
    templating_config: DEV

  DCM_STAGE:
    account_identifier: MYORG-MYACCOUNT_STAGE
    project_name: DCM_DEMO.PROJECTS.DCM_PROJECT_STG
    project_owner: DCM_STAGE_DEPLOYER
    templating_config: STAGE

  DCM_PROD:
    account_identifier: MYORG-MYACCOUNT_PROD
    project_name: DCM_DEMO.PROJECTS.DCM_PROJECT_PROD
    project_owner: DCM_PROD_DEPLOYER
    templating_config: PROD

templating:
  defaults:
    user: "GITHUB_ACTIONS_SERVICE_USER"
    wh_size: "SMALL"

  configurations:
    DEV:
      env_suffix: "_DEV"
      user: "INSERT_YOUR_USER"
      wh_size: "X-SMALL"
      teams:
        - name: "DEV_TEAM"
          write_access: TRUE

    STAGE:
      env_suffix: "_STG"
      teams:
        - name: "TEST_TEAM_A"
          write_access: TRUE
        - name: "TEST_TEAM_B"
          write_access: FALSE

    PROD:
      env_suffix: ""
      teams:
        - name: "Marketing"
          write_access: FALSE
        - name: "Finance"
          write_access: FALSE
          wh_size: "LARGE"
        - name: "HR"
          write_access: FALSE
        - name: "IT"
          write_access: TRUE

Erstellen von Objektdefinitionsdateien

Eine DCM project-Definitionsdatei ist eine Vorlage, die in gültige SQL-Anweisungen zum Verwalten von Snowflake-Objekten aufgelöst wird. Jedes DCM project erfordert mindestens eine Definitionsdatei.

Sie können Ihre Objektdefinitionen und Berechtigungen über mehrere Dateien und Ordner hinweg organisieren. Snowflake empfiehlt, eine Struktur zu wählen, die die Geschäftslogik des Projekts repräsentiert (z. B. Bronze, Silber und Gold), anstatt nach Objekttyp zu gruppieren.

Definitionsdateien können nur DEFINE-,GRANT- oder ATTACH-Anweisungen enthalten. Andere SQL-Befehle werden nicht unterstützt.

Für einen schnellen Einstieg in die Arbeit mit DCM Projects können Sie Ihre bestehenden SQL-Bereitstellungsskripte mithilfe des DEFINE-Schlüsselworts für Ihre bestehende DDLs (für unterstützte Objekttypen) konvertieren.

Die DEFINE-Anweisung funktioniert wie der CREATE OR ALTER <objekt>-Befehl, jedoch mit den folgenden wesentlichen Unterschieden:

  • Die Reihenfolge und der Speicherort von DEFINE-Anweisungen spielt keine Rolle. Snowflake sammelt und sortiert während der Ausführung des Projekts alle Anweisungen aus allen Definitionsdateien.

  • Wenn Sie eine DEFINE-Anweisung entfernen, löscht Snowflake das entsprechende Objekt, wenn Sie das Projekt das nächste Mal bereitstellen.

  • Es wird nur eine Teilmenge von Snowflake-Objekten unterstützt. Weitere Details dazu finden Sie unter Unterstützte Objekttypen in DCM Projects.

  • Alle Objekte müssen mit einem vollqualifizierten Namen im Format database.schema.object_name definiert werden.

Definitionsdateien können verschiedene Jinja2-Vorlagenoptionen und erweiterte Vorlagen-Features enthalten, mit denen Sie Folgendes tun können:

  • Passen Sie Dateiinhalte zur Laufzeit mithilfe von Vorlagenvariablen an.

  • Verwenden Sie die Jinja2-Syntax für Logik wie Schleifen und Bedingungen.

  • Machen Sie Definitionsdateien für verschiedene Szenarios wiederverwendbar und anpassbar.

Vorlagen für die Objektdefinition

DCM Projects unterstützen das Jinja2-Framework für Vorlagen von SQL-Anweisungen. Sie können Variablen deklarieren und Werte mit der Jinja2-Syntax entweder von Konfigurationsprofilen aus, im Befehl EXECUTE DCM PROJECT oder innerhalb von Jinja zuordnen. Sie können Schleifen auch durch Wertelisten, Groß-/Kleinschreibungsanweisungen, wiederverwendbare Funktionen und mehr konstruieren. Weitere Informationen dazu finden Sie in der `Jinja2-Dokumentation<https://jinja.palletsprojects.com/en/stable/>`_.

Zu den unterstützten Jinja2-Funktionen gehören:

  • Zeichenfolgen-Ersetzungen

  • Listen

  • Wörterbücher und verschachtelte Wörterbücher

  • Bedingungen (IF-Anweisungen)

  • Schleifen

  • Globale und dateibasierte Makros

    • Im Ordner sources/macros definierte Makros können für alle Definitionsdateien verwendet werden.

    • Makros, die in einer Datei definiert sind, können innerhalb der Datei verwendet werden.

Zu den nicht unterstützten Jinja2-Funktionen gehören:

Bemerkung

Der _Snow-Bezeichner ist für die zukünftige Verwendung reserviert und kann nicht als Variablen- oder Makroname verwendet werden

Wichtig

Verwenden Sie keine DCM Projects-Vorlagenvariablen für Objektdefinitionen, die sensible Informationen oder Anmeldeinformationen enthalten. Die gerenderten SQL-Definitionen blenden keine Werte aus, die durch Umgebungsvariablen eingefügt wurden.

Ebenso sollten Sie keine personenbezogenen Daten, sensiblen Daten, exportkontrollierten Daten oder andere regulierte Daten als Metadaten eingeben, z. B. Dateinamen, Konfigurations- und Variablennamen, wenn Sie den Snowflake-Dienst nutzen. Weitere Informationen dazu finden Sie unter `Metadatenfelder in Snowflake<https://docs.snowflake.com/en/sql-reference/metadata>`_.

Nachfolgend sehen Sie ein Beispiel einer DCM project-Definitionsdatei, die Jinja2-Vorlagen verwendet:

DEFINE WAREHOUSE DCM_PROJECT_WH_{{db}}
  WITH
    warehouse_size = '{{wh_size}}'
    auto_suspend = 300;

Das folgende Beispiel zeigt eine DCM project-Manifest-Datei (manifest.yml), die zwei Konfigurationen definiert: DEV und PROD.

templating:
  configurations:
    DEV:
      db: "DEV_2"
      wh_size: "X-SMALL"
    PROD:
      db: "PROD"
      wh_size: "LARGE"

Rendern dieser Warehouse-Definition mit der DEV-Konfiguration (wird automatisch über die templating_config des Ziels oder zur Laufzeit ausgewählt) wird aufgelöst in:

DEFINE WAREHOUSE DCM_PROJECT_WH_DEV_2
  WITH
    warehouse_size = "X-SMALL"
    auto_suspend = 300;

Makros

Makrodateien sind beliebigeSQL-Dateien, die sich im Ordner macros und seinen Unterordnern befinden. Sie können nur Makros enthalten.

Beispiel für die Verzeichnisstruktur eines DCM project mit Makrodateien ist:

My_dcm_project
 |_ manifest.yml
 |_ sources
    |_ definitions
       |_ my_definitions.sql
    |_ macros
       |_ my_global_macros.sql

Ähnlich wie bei Funktionen in regulären Programmiersprachen helfen Makros dabei, häufig verwendete Codeelemente in wiederverwendbaren Funktionen zu organisieren, um so Wiederholungen zu vermeiden und das DRY-Prinzip (nicht sich selbst wiederholen) zu befolgen. Makros in DCM Projects funktionieren auf die gleiche Weise wie `Jinja2-Makros<https://jinja.palletsprojects.com/en/stable/templates/#macros>`_ mit den folgenden Ausnahmen:

Automatischer Import von globalen Makros

Während des Renderns der Definitionsdatei werden die Quelldateien auf mögliche Makroaufrufe durchsucht. Wenn ein aufgerufenes Makro in einer Makrodatei definiert ist, wird das implizite ` […] Import-Tag<https://jinja.palletsprojects.com/en/stable/templates/#import>`_ automatisch hinzugefügt, sodass kein expliziter Import erforderlich ist.

Ähnlich wie bei `Jinja2-Makros<https://jinja.palletsprojects.com/en/stable/templates/#macros>`_ können Sie ein lokales Makro definieren, indem Sie ihm einen Unterstrich voranstellen. Ein lokales Makro kann nur in der Datei verwendet werden, in der es deklariert ist, und ist für andere Dateien nicht sichtbar.

Kommentare zur Vorlage

In SQL-Befehlen können Sie -- vor Ihrem Code hinzufügen, um die Zeile auszukommentieren. Jinja verarbeitet weiterhin Variablen innerhalb des SQL-Codes, lässt aber die SQL-Kommentare aus.

Beispielsweise der folgende Jinja-Code:

-- hello {{ project_owner_role }}

Wird gerendert als:

-- hello DCM_DEVELOPER

Auskommentierte Befehle werden in SQL nicht ausgeführt. Sie können Kommentare zu Vorlagen verwenden, um Jinja-Vorlagen zu debuggen, ohne Ihren SQL-Code zu beeinträchtigen.

Um Jinja-Code beim Rendern zu ignorieren, fügen Sie # innerhalb von öffnenden und schließenden Klammern hinzu, wie im folgenden Beispiel gezeigt:

{# This Jinja comment will not appear in the rendered output. #}

Konfigurationen

Wenn Sie Vorlagen in Ihren Objektdefinitionen verwenden, haben Sie die folgenden Optionen:

  • Weisen Sie Variablen zur Laufzeit Werte zu.

  • Definieren Sie verschiedene Konfigurationsprofile unter templating: configurations: in der manifest.yml. Jedes Ziel kann über templating_config auf eine Konfiguration verweisen. Weitere Details dazu finden Sie unter Konfiguration von Projektvorlagen.

    Wenn Konfigurationsprofile definiert sind und ein Ziel eines über templating_config referenziert, wird die Konfiguration automatisch angewendet, wenn Sie dieses Ziel verwenden. Weitere Beispiele finden Sie unter DCM project planen.

    Der primäre Anwendungsfall für Konfigurationsprofile in DCM Projects sollte auf verschiedene Umgebungen abzielen. Mit Konfigurationsprofilen können Sie Folgendes tun:

    • Stellen Sie denselben Code in mehreren Umgebungen bereit.

    • Testen Sie den Produktionscode in einer Nicht-Produktions-Umgebung in reduziertem Umfang.

    • Verwalten mehrerer isolierter Umgebungen im selben Konto

    Nicht alle Vorlagenkonfigurationen müssen von einem Zielprofil referenziert werden. Sie können nicht verwendete Konfigurationen behalten, um die Vorlagenkonfiguration für Ihr Ziel zu wechseln.

  • Definieren Sie gemeinsame Standardwerte unter templating: defaults:, um die Wiederholung allgemeiner Variablen in verschiedenen Konfigurationen zu vermeiden. Weitere Details dazu finden Sie unter Konfiguration von Projektvorlagen.

  • Überschreiben Sie bestimmte Variablen mit Einmalwerten zur Laufzeit unter Verwendung des --variable-Flag in der CLI.

Variablen werden mit einer dreistufigen Hierarchie aufgelöst: Globale Standardwerte < Konfigurationsvariablen < Laufzeit-Ausführungsvariablen.

Wörterbücher

DCM Projects-Vorlagen unterstützen Wörterbücher als Variablenwerte und ermöglichen so eine strukturierte Konfiguration für komplexe Bereitstellungen mit mehreren Mandanten oder mehreren Ressourcen.

Durch Gruppieren zusammengehöriger Konfigurationsdetails in Wörterbüchern erhalten Sie Folgendes:

  • Granulare Kontrolle: Wenden Sie bestimmte Einstellungen, wie z. B. Warehouse-Größen, Aufbewahrungsrichtlinien und Berechtigungen, auf einzelne Ressourcen an, ohne für jede Variante eine eigene Logik zu schreiben.

  • Saubere Code-Basis: Ersetzen Sie sich wiederholende, fest codierte Skripte durch dynamische Schleifen, die sich je nach Konfiguration anpassen.

  • Skalierbarkeit: Richten Sie neue Teams oder Ressourcen ein, indem Sie Einträge zu Ihrer Konfiguration hinzufügen, anstatt die Bereitstellungspipelines umzustrukturieren.

Bemerkung

Wörterbücher können im Manifest definiert, aber zur Laufzeit nicht mit dem --variable-Flag oder SQL``USING CONFIGURATION (…)`` überschrieben werden. Nur skalare Werte und Listen können zur Laufzeit überschrieben werden.

Beispiel für die Anwendung eines Wörterbuchs: Bereitstellung in einer Umgebung mit mehreren Mandanten

Stellen Sie sich eine Plattform vor, die von mehreren Abteilungen gemeinsam genutzt wird, z. B. Marketing, Finanzen und HR, mit jeweils unterschiedlichen Compliance- und Computeanforderungen. Mit Wörterbüchern definieren Sie eine einzige Konfiguration, die die Anforderungen der einzelnen Teams erfasst.

Manifest-Beispiel:

templating:
  defaults:
    user: "GITHUB_ACTIONS_SERVICE_USER"
    wh_size: "X-SMALL"
  configurations:
    PROD:
      env_suffix: ""
      project_owner_role: "DCM_PROD_DEPLOYER"
      teams:
        - name: "Marketing"
          wh_size: "MEDIUM"
          data_retention_days: 14
          needs_sandbox_schema: true
        - name: "Finance"
          wh_size: "X-LARGE"
          data_retention_days: 90
          needs_sandbox_schema: false
        - name: "HR"
          data_retention_days: 30
          needs_sandbox_schema: false

Definitionsbeispiel:

Ihre SQL-Vorlage durchläuft dieses Wörterbuch in einer Schleife. Es erstellt automatisch Schemas, weist die korrekte Aufbewahrungsrichtlinie zu und erstellt je nach Bedingung zusätzliche Ressourcen nur für die Teams, die diese anfordern.

-- loop through team dictionaries
{% for team in teams %}
    {% set team_name = team.name | upper %}

    -- inject dictionary values directly into object properties
    define schema DCM_DEMO_1{{env_suffix}}.{{team_name}}
        comment = 'using JINJA dictionary values'
        data_retention_time_in_days = {{ team.data_retention_days }};

    -- pass the name to your macro
    {{ create_team_roles(team_name) }}

    define table DCM_DEMO_1{{env_suffix}}.{{team_name}}.PRODUCTS(
        ITEM_NAME varchar,
        ITEM_ID varchar,
        ITEM_CATEGORY array
    )
    data_metric_schedule = 'TRIGGER_ON_CHANGES';

    {% if team_name == 'HR' %}
        define table DCM_DEMO_1{{env_suffix}}.{{team_name}}.EMPLOYEES(
            NAME varchar,
            ID int
        )
        comment = 'This table is only created in HR';
    {% endif %}

    -- use dictionary booleans to deploy optional infrastructure
    {% if team.needs_sandbox_schema | default(false) %}
        define schema DCM_DEMO_1{{env_suffix}}.{{team_name}}_SANDBOX
            comment = 'Sandbox schema defined via dictionary flag'
            data_retention_time_in_days = 1;
    {% endif %}

{% endfor %}