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 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;

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;

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 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

Ansichten, sichere Ansichten, SQL-UDF, SQL-UDTF

und andere Objekte, die mit „name“ referenziert werden

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

Materialisierte Ansicht

Tabelle, externe 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.

Snowflake-Objekte

Diese Ansicht erfasst im Abfrageergebnis keine Snowflake-eigenen Objekte als referenzierte Objekte.

Wenn beispielsweise eine benutzerdefinierte Ansicht von Daten aus einer anderen Account Usage-Ansicht wie LOGIN_HISTORY abhängt, gibt die Ansicht OBJECT_DEPENDENCIES die Ansicht LOGIN_HISTORY nicht als referenziertes Objekt an.

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;

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-Funktionen & 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.

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.

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;

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';

+-------------------------+---------------------------+------------------------+--------------------------+
| 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;

Ä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;

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
;

+-----------------------------------------------+------------------------+--------------------------+-------------------------+---------------------------+
| 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 benutzerdefinierte 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;

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
;

+-----------------------------------------------+-------------------------+---------------------------+------------------------+--------------------------+
| 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                    |
+-----------------------------------------------+-------------------------+---------------------------+------------------------+--------------------------+
Zurück zum Anfang