Objektabhängigkeiten

Unter diesem Thema werden Konzepte zu Objektabhängigkeiten und Informationen im Zusammenhang mit der Account Usage-Ansicht OBJECT_DEPENDENCIES bereitgestellt.

Unter diesem Thema:

Was ist eine Objektabhängigkeit?

Objektabhängigkeit bedeutet, dass die Bearbeitung des Objekts voraussetzt, dass dieses Objekt auf eigene Metadaten oder auf Metadaten mindestens eines anderen Objekts verweist. Snowflake verfolgt Objektabhängigkeiten in der Account Usage-Ansicht OBJECT_DEPENDENCIES.

Snowflake unterstützt Objektabhängigkeiten in Ihrem lokalen Snowflake-Konto und bestimmte Abhängigkeiten im Zusammenhang mit Data Sharing, z. B. das Erstellen einer Ansicht im Verbraucherkonto aus einer Tabelle, die über eine Anbieterfreigabe zur Verfügung gestellt wird. Die Abhängigkeiten im Zusammenhang mit freigegebenen Objekten ermöglichen es Datenverantwortlichen, eine höhere Datenintegrität sicherzustellen, Regulierungsstandards besser einzuhalten und detailliertere Auswirkungsanalysen zu erstellen.

Snowflake unterstützt die folgenden Abhängigkeitstypen, die eine Abhängigkeit auslösen können: der name-Wert des Objekts, der ID-Wert des Objekts und die Kombination aus name-Wert und ID-Wert des Objekts.

BY_NAME

Eine BY_NAME-Abhängigkeit tritt auf, wenn die SQL-Anweisung den name-Wert des Objekts selbst angibt (z. B. ein CREATE- oder ALTER-Befehl) oder wenn ein Objekt den name-Wert eines anderen Objekts aufruft (z. B. unter Verwendung einer FROM-Klausel), um eine SQL-Operation auszuführen.

Betrachten Sie beispielsweise die folgende Anweisung:

create view myview as select * from mytable;
Copy

Der name-Wert der Tabelle mytable gehört zu den Metadaten der Tabelle. Die Ansicht mit dem Namen myview ist abhängig von der Tabelle mit dem Namen mytable. Die Tabelle muss also vorhanden sein, damit die Ansicht erstellt werden kann.

Snowflake verweist auf die Ansicht mit dem Namen myview als das referenzierende Objekt und auf die Tabelle mytable als das referenzierte Objekt.

BY_ID

Eine BY_ID-Abhängigkeit tritt auf, wenn ein Objekt den ID-Wert eines anderen Objekts speichert. Ein Beispiel für eine ID-Abhängigkeit ist ein externer Stagingbereich, der den OBJECT_ID-Wert einer Speicherintegration speichert. Derzeit ist der ID-Wert des Speicherintegrationsobjekts nur für Snowflake zugänglich und kann durch keine kundenseitige SQL-Operation sichtbar gemacht werden.

create stage my_ext_stage
  url='s3://load/files/'
  storage_integration = myint;
Copy

Snowflake verweist auf den externen Stagingbereich mit dem Namen my_ext_stage als das referenzierende Objekt und auf die Speicherintegration mit dem Namen myint als das referenzierte Objekt.

BY_NAME_AND_ID

Einige Snowflake-Objekte (z. B. materialisierte Ansichten) sind sowohl vom name-Wert eines Objekts als auch vom ID-Wert eines Objekts abhängig. Diese Objekte sind oft das Ergebnis einer CREATE OR REPLACE-Anweisung zum Ersetzen eines vorhandenen Objekts oder das Ergebnis einer ALTER-Anweisung zum Umbenennen eines Objekts.

Weitere Informationen dazu finden Sie im Abschnitt Allgemeine Nutzungshinweise der Account Usage-Ansicht OBJECT_DEPENDENCIES.

Unterstützte Objektabhängigkeiten

Snowflake unterstützt referenzierende Objekte und referenzierte Objekte wie folgt:

Referenzierendes Objekt

Referenziertes Objekt

Abhängigkeitstyp

Ansicht, sichere Ansicht, SQL-UDF, SQL-UDTF und andere mit „name“ referenzierte Objekte

Ansicht

Sichere Ansicht

Materialisierte Ansicht

UDF (alle Arten)

UDTF

und andere Objekte, die mit „name“ referenziert werden

BY_NAME

Externer Stagingbereich

Stream

Speicherintegration

Tabelle, Ansicht, sichere Ansicht

BY_ID

Externe Tabelle

Stagingbereich

BY_ID

Materialisierte Ansicht

Tabelle, externe Tabelle

BY_NAME_AND_ID

Beachten Sie, dass Snowflake im Zusammenhang mit Data Sharing nur die folgenden Objekte unterstützt:

Referenzierendes Objekt

Referenziertes Objekt

Abhängigkeitstyp

Ansicht, SQL-UDF, SQL-UDTF

Tabelle

Sichere Ansicht

Sichere materialisierte Ansicht

Sichere UDF und sichere UDTF

BY_NAME

Materialisierte Ansicht

Tabelle

BY_NAME_AND_ID

Weitere Informationen dazu finden Sie im Abschnitt Nutzungshinweise der Ansicht OBJECT_DEPENDENCIES.

Vorteile

Das Identifizieren von Objektabhängigkeiten kann einen Einblick in die folgenden Anwendungsfälle der Datenverfolgung geben:

Analyse der Auswirkungen

Die Kenntnis der Objektabhängigkeit ermöglicht es Datenverwaltern, die Beziehungen zwischen referenzierenden Objekten und referenzierten Objekten zu identifizieren und so sicherzustellen, dass Aktualisierungen referenzierter Objekte keine negativen Auswirkungen auf die Benutzer des referenzierenden Objekts haben.

Beispiel: Der Eigentümer einer Tabelle möchte eine Spalte zu der Tabelle hinzuzufügen. Bei Abfrage der Ansicht OBJECT_DEPENDENCIES anhand des Tabellennamens werden alle Objekte (z. B. Ansichten) zurückgegeben, die betroffen sein werden.

Der Datenverwalter kann dann einen Aktionsplan koordinieren, um sicherzustellen, dass der Zeitpunkt der Tabellen- und Ansichtsaktualisierungen nicht zu fehlerhaften Abfragen führt, die sich negativ auf die Benutzer auswirken, die Abfragen auf den aus der Tabelle erstellten Ansichten ausführen.

Compliance

Die Objektabhängigkeitsbeziehung hilft dem Compliance-Beauftragten, die Beziehung zwischen sensiblen Datenquellen (d. h. dem referenzierten Objekt) und Datenzielen (d. h. dem referenzierenden Objekt) zu erkennen. Der Compliance-Beauftragte kann dann entscheiden, wie die Aktualisierung des referenzierten Objekts und des referenzierenden Objekts gemäß den Compliance-Anforderungen (z. B. GDPR) am besten ausgeführt werden soll.

Datenintegrität

Dank der Objektabhängigkeitbeziehungen können Datenexperten wie Analysten, Wissenschaftlern, Compliance-Beauftragten und anderen Geschäftsanwendern sicher sein, dass Daten aus einer vertrauenswürdigen Quelle stammen.

Einschränkungen

Zusätzlich zu den Nutzungshinweisen für die Ansicht sind bei der Abfrage der OBJECT_DEPENDENCIES-Ansicht die folgenden Einschränkungen zu beachten:

Sitzungsparameter

Snowflake kann die Abhängigkeiten von Objekten, die in ihren Definitionen Sitzungsparameter enthalten, nicht genau berechnen, da Sitzungsparameter je nach Kontext unterschiedliche Werte annehmen können.

Snowflake empfiehlt, in Ansichts- und Funktionsdefinitionen keine Sitzungsvariablen zu verwenden.

Snowflake-Implementierungen

Diese Ansicht erfasst keine Abhängigkeiten, die für Snowflake-Implementierungen erforderlich sind. So erfasst die Ansicht beispielsweise keine Abhängigkeiten, die notwendig sind, um eine neue Tabelle aus dem Klon einer anderen Tabelle zu erstellen.

Auflösung des Objektnamens

Wenn eine Ansichtsdefinition eine Funktion zum Aufrufen eines Objekts verwendet, um die Ansicht zu erstellen, oder wenn ein Objekt innerhalb einer anderen Funktion oder Ansicht aufgerufen wird, erfasst Snowflake keine Objektabhängigkeiten auf. Beispiel:

create or replace view v_on_stage_function
as
select *
from T1
where get_presigned_url(@stage1, 'data_0.csv.gz')
is not null;
Copy

In diesem Beispiel ruft die Funktion get_presigned_url den Stagingbereich stage1 auf. Snowflake erfasst nicht, dass die Ansicht mit dem Namen v_on_stage_function vom Stagingbereich mit dem Namen stage1 abhängt.

Beschädigte Abhängigkeiten

Wenn der Wert für den Abhängigkeitstyp BY_NAME_AND_ID ist und sich eine Objektabhängigkeit aufgrund einer CREATE OR REPLACE- oder ALTER-Operation an einem Objekt ändert, erfasst Snowflake nur die Objektabhängigkeit vor diesen Operationen.

Snowflake erfasst die Objektabhängigkeit nach diesen Operationen nicht im Ergebnis der Ansichtsabfrage, da das Ergebnis eine ungültige Referenz ist.

Objektabhängigkeiten mit Snowflake-Features und -Diensten

Externe Objekte

Snowflake verfolgt Objektabhängigkeiten nur für Snowflake-Objekte. Wenn beispielsweise ein Snowflake-Objekt von einem Amazon S3-Bucket abhängt, erfasst diese Ansicht die Abhängigkeit vom Bucket nicht, da der Bucket ein Amazon-Objekt und kein Snowflake-Objekt ist.

Replikation

Wenn ein sekundäres Objekt von einem primären Objekt abhängt, werden in dieser Ansicht keine Abhängigkeiten aufgrund einer Replikationsoperation erfasst.

Datenfreigabe (Data Sharing)

Bei Anbieterkonten kann mit dieser Ansicht ein Data Sharing-Anbieterkonto nicht die abhängigen Objekte eines Data Sharing-Verbraucherkontos ermitteln. Ein Data Sharing-Anbieter erstellt zum Beispiel eine Ansicht und gibt diese frei. Der Data Sharing-Anbieter kann diese Ansicht nicht verwenden, um Objekte im Verbraucherkonto zu ermitteln, die aus der freigegebenen Ansicht erstellt wurde (z. B. neue Tabellen oder Ansichten).

Bei Verbraucherkonten kann mit dieser Ansicht ein Data Sharing-Verbraucherkonto nicht die abhängigen Objekte eines Data Sharing-Anbieterkontos ermitteln. Wenn beispielsweise ein Data Sharing-Verbraucherkonto eine vom Data Sharing-Anbieterkonto zur Verfügung gestellte UDF verwendet, kann der Data Sharing-Verbraucher diese Ansicht nicht verwenden, um Objekte zu identifizieren, von denen die freigegebene UDF abhängt.

Weitere Informationen dazu finden Sie unter Nutzungshinweise zu Data Sharing.

Abfragen der OBJECT_DEPENDENCIES-Ansicht

In den Beispielen werden die folgenden Anwendungsfälle betrachtet:

  1. Objekte anzeigen, die von einer externen Tabelle abhängen.

  2. Auswirkungsanalyse: Objekte ermitteln, auf die eine Tabelle verweist.

  3. GDPR: Datenquelle einer bestimmten Ansicht ermitteln.

  4. Datenfreigabe (Data Sharing).

Objekte anzeigen, die von einer externen Tabelle abhängen

Erstellen Sie eine materialisierte Ansicht namens sales_view aus der externen Tabelle namens sales_staging_table:

CREATE OR REPLACE MATERIALIZED VIEW sales_view AS SELECT * FROM sales_staging_table;
Copy

Verwenden Sie die Ansicht OBJECT_DEPENDENCIES im Account Usage-Schema der freigegebenen SNOWFLAKE-Datenbank. Beachten Sie, dass die materialisierte Ansicht referencing_object_name und die externe Tabelle referenced_object_domain ist:

SELECT referencing_object_name, referencing_object_domain, referenced_object_name, referenced_object_domain
FROM snowflake.account_usage.object_dependencies
WHERE referenced_object_name = 'SALES_STAGING_TABLE' and referenced_object_domain = 'EXTERNAL TABLE';
Copy
+-------------------------+---------------------------+------------------------+--------------------------+
| REFERENCING_OBJECT_NAME | REFERENCING_OBJECT_DOMAIN | REFERENCED_OBJECT_NAME | REFERENCED_OBJECT_DOMAIN |
+-------------------------+---------------------------+------------------------+--------------------------+
| SALES_VIEW              | MATERIALIZED VIEW         | SALES_STAGING_TABLE    | EXTERNAL TABLE           |
+-------------------------+---------------------------+------------------------+--------------------------+

Auswirkungsanalyse: Ermitteln der Objekte, auf die eine Tabelle verweist

Angenommen, eine Basistabelle mit dem Namen SALES_NA liegt vor, wobei NA für Nordamerika, US für die USA und CAL für Kalifornien steht, und es gibt eine Reihe von verschachtelten Ansichten:

  • (Tabelle) SALES_NA » (Ansicht) NORTH_AMERICA_SALES » (Ansicht) US_SALES

  • (Tabelle) SALES_NA » (Ansicht) NORTH_AMERICA_SALES » (Ansicht) CAL_SALES

Zum Erstellen der Tabelle und der verschachtelten Ansichten führen Sie die folgenden Befehle aus:

CREATE TABLE sales_na(product string);
CREATE OR REPLACE VIEW north_america_sales AS SELECT * FROM sales_na;
CREATE VIEW us_sales AS SELECT * FROM north_america_sales;
CREATE VIEW cal_sales AS SELECT * FROM north_america_sales;
Copy

Ähnlich verhält es sich mit der Beziehung der Basistabelle SALES_NA zu ihren verschachtelten Ansichten sowie der Basistabelle SALES_UK, bei der UK für Großbritannien steht, und deren verschachtelter Ansicht.

Beachten Sie, dass zwei verschiedene Ansichten als Quellobjekte dienen, um die Ansicht mit dem Namen GLOBAL_SALES abzuleiten:

  • (Tabelle) SALES_NA » (Ansicht) NORTH_AMERICA_SALES » (Ansicht) GLOBAL_SALES

  • (Tabelle) SALES_UK » (Ansicht) GLOBAL_SALES

Zum Erstellen dieser verschachtelten Ansichten führen Sie die folgenden Befehle aus:

CREATE TABLE sales_uk (product string);
CREATE VIEW global_sales AS SELECT * FROM sales_uk UNION ALL SELECT * FROM north_america_sales;
Copy

Fragen Sie die Ansicht OBJECT_DEPENDENCIES im Account Usage-Schema der freigegebenen Datenbank SNOWFLAKE ab, um die Objektreferenzen für die Tabelle SALES_NA zu ermitteln. Beachten Sie die vierte Zeile im Abfrageergebnis, in der die Tabelle SALES_NA angegeben ist, aber keine Referenz auf die Tabelle SALES_UK:

WITH RECURSIVE referenced_cte
(object_name_path, referenced_object_name, referenced_object_domain, referencing_object_domain, referencing_object_name, referenced_object_id, referencing_object_id)
    AS
      (
        SELECT referenced_object_name || '-->' || referencing_object_name as object_name_path,
               referenced_object_name, referenced_object_domain, referencing_object_domain, referencing_object_name, referenced_object_id, referencing_object_id
          FROM snowflake.account_usage.object_dependencies referencing
          WHERE true
            AND referenced_object_name = 'SALES_NA' AND referenced_object_domain='TABLE'

        UNION ALL

        SELECT object_name_path || '-->' || referencing.referencing_object_name,
              referencing.referenced_object_name, referencing.referenced_object_domain, referencing.referencing_object_domain, referencing.referencing_object_name,
              referencing.referenced_object_id, referencing.referencing_object_id
          FROM snowflake.account_usage.object_dependencies referencing JOIN referenced_cte
            ON referencing.referenced_object_id = referenced_cte.referencing_object_id
            AND referencing.referenced_object_domain = referenced_cte.referencing_object_domain
      )

  SELECT object_name_path, referenced_object_name, referenced_object_domain, referencing_object_name, referencing_object_domain
    FROM referenced_cte
;
Copy
+-----------------------------------------------+------------------------+--------------------------+-------------------------+---------------------------+
| OBJECT_NAME_PATH                              | REFERENCED_OBJECT_NAME | REFERENCED_OBJECT_DOMAIN | REFERENCING_OBJECT_NAME | REFERENCING_OBJECT_DOMAIN |
+-----------------------------------------------+------------------------+--------------------------+-------------------------+---------------------------+
| SALES_NA-->NORTH_AMERICA_SALES                | SALES_NA               | TABLE                    | NORTH_AMERICA_SALES     | VIEW                      |
| SALES_NA-->NORTH_AMERICA_SALES-->CAL_SALES    | NORTH_AMERICA_SALES    | VIEW                     | CAL_SALES               | VIEW                      |
| SALES_NA-->NORTH_AMERICA_SALES-->US_SALES     | NORTH_AMERICA_SALES    | VIEW                     | US_SALES                | VIEW                      |
| SALES_NA-->NORTH_AMERICA_SALES-->GLOBAL_SALES | NORTH_AMERICA_SALES    | VIEW                     | GLOBAL_SALES            | VIEW                      |
+-----------------------------------------------+------------------------+--------------------------+-------------------------+---------------------------+

GDPR: Datenquelle einer bestimmten Ansicht ermitteln

Abgeleitete Objekte (z. B. Ansichten, CTAS) können aus vielen verschiedenen Quellobjekten erstellt werden, um eine kundenspezifische Ansicht oder ein Dashboard bereitzustellen. Um gesetzliche Anforderungen wie GDPR zu erfüllen, müssen Compliance-Beauftragte und Auditoren in der Lage sein, Daten von einem bestimmten Objekt zu seiner ursprünglichen Datenquelle zurückzuverfolgen.

Beispielsweise wird die Ansicht GLOBAL_SALES von zwei verschiedenen Abhängigkeitspfaden abgeleitet, die auf zwei verschiedene Basistabellen verweisen:

  • (Tabelle) SALES_NA » (Ansicht) NORTH_AMERICA_SALES » (Ansicht) GLOBAL_SALES

  • (Tabelle) SALES_UK » (Ansicht) GLOBAL_SALES

Zum Erstellen dieser verschachtelten Ansichten führen Sie die folgenden Befehle aus:

CREATE TABLE sales_na (product string);
CREATE OR REPLACE VIEW north_america_sales AS SELECT * FROM sales_na;
CREATE TABLE sales_uk (product string);
CREATE VIEW global_sales AS SELECT * FROM sales_uk UNION ALL SELECT * FROM north_america_sales;
Copy

Fragen Sie die Ansicht OBJECT_DEPENDENCIES im Account Usage-Schema der freigegebenen Datenbank SNOWFLAKE ab, um die Datenquellen der Ansicht GLOBAL_SALES zu ermitteln. Jede Zeile im Abfrageergebnis gibt einen Abhängigkeitspfad zu einem eindeutigen Objekt an.

WITH RECURSIVE referenced_cte
(object_name_path, referenced_object_name, referenced_object_domain, referencing_object_domain, referencing_object_name, referenced_object_id, referencing_object_id)
    AS
      (
        SELECT referenced_object_name || '<--' || referencing_object_name AS object_name_path,
               referenced_object_name, referenced_object_domain, referencing_object_domain, referencing_object_name, referenced_object_id, referencing_object_id
          from snowflake.account_usage.object_dependencies referencing
          WHERE true
            AND referencing_object_name = 'GLOBAL_SALES' and referencing_object_domain='VIEW'

        UNION ALL

        SELECT referencing.referenced_object_name || '<--' || object_name_path,
              referencing.referenced_object_name, referencing.referenced_object_domain, referencing.referencing_object_domain, referencing.referencing_object_name,
              referencing.referenced_object_id, referencing.referencing_object_id
          FROM snowflake.account_usage.object_dependencies referencing JOIN referenced_cte
            ON referencing.referencing_object_id = referenced_cte.referenced_object_id
            AND referencing.referencing_object_domain = referenced_cte.referenced_object_domain
      )

  SELECT object_name_path, referencing_object_name, referencing_object_domain, referenced_object_name, referenced_object_domain
    FROM referenced_cte
;
Copy
+-----------------------------------------------+-------------------------+---------------------------+------------------------+--------------------------+
| OBJECT_NAME_PATH                              | REFERENCING_OBJECT_NAME | REFERENCING_OBJECT_DOMAIN | REFERENCED_OBJECT_NAME | REFERENCED_OBJECT_DOMAIN |
+-----------------------------------------------+-------------------------+---------------------------+------------------------+--------------------------+
| SALES_UK<--GLOBAL_SALES                       | GLOBAL_SALES            | VIEW                      | SALES_UK               | TABLE                    |
| NORTH_AMERICA_SALES<--GLOBAL_SALES            | GLOBAL_SALES            | VIEW                      | NORTH_AMERICA_SALES    | VIEW                     |
| SALES_NA<--NORTH_AMERICA_SALES<--GLOBAL_SALES | NORTH_AMERICA_SALES     | VIEW                      | SALES_NA               | TABLE                    |
+-----------------------------------------------+-------------------------+---------------------------+------------------------+--------------------------+

Datenfreigabe (Data Sharing)

Betrachten Sie die folgende Tabelle, die ein Auszug aus der Ansicht OBJECT_DEPENDENCIES im Verbraucherkonto ist:

  • V1 gibt eine Ansicht an, die der Verbraucher aus einem freigegebenen Objekt erstellt.

  • S_V1 gibt eine Ansicht an, die der Anbieter freigibt.

  • S_T1 gibt eine Tabelle an, die der Anbieter freigibt.

Zeile

REFERENCING_OBJECT_NAME

REFERENCED_OBJECT_NAME

REFERENCED_OBJECT_DOMAIN

REFERENCED_OBJECT_ID

1

V1

S_V1

TABLE

NULL

2

V1

S_T1

TABLE

NULL

Beachten Sie bei dieser Tabelle Folgendes:

  • Wenn der Anbieter S_T1 aus der Freigabe entfernt, sieht der Verbraucher in seiner lokalen Ansicht weiterhin Zeilen, die S_T1 angeben (Zeile 2), es sei denn, S_T1 wurde vor dem Widerruf umbenannt.

  • Wenn der Anbieter eine Tabelle oder Ansicht in seinem Konto löscht, ist die Tabelle bzw. Ansicht nicht mehr in der Freigabe enthalten. Die lokale Verbraucheransicht behält vorhandene Datensätze der gelöschten Tabelle oder Ansicht bei, da die Tabelle oder Ansicht vor der Löschoperation im Anbieterkonto freigegeben wurde.

    Der Verbraucher kann Änderungen an Ansichten im Anbieterkonto nicht beobachten.