Ansicht ACCESS_HISTORY

Diese Account Usage-Ansicht kann verwendet werden, um den Zugriffsverlauf von Snowflake-Objekten (z. B. Tabellen, Ansichten, Spalten) innerhalb der letzten 365 Tage (1 Jahr) abzufragen.

Spalten

Spaltenname

Datentyp

Beschreibung

QUERY_ID

TEXT

Interner, vom System generierter Bezeichner für die SQL-Anweisung. Dieser Wert wird auch im QUERY_HISTORY-Ansicht erwähnt.

QUERY_START_TIME

TIMESTAMP_LTZ

Startzeit der Anweisung (UTC-Zeitzone).

USER_NAME

TEXT

Benutzer, der die Abfrage ausgegeben hat.

DIRECT_OBJECTS_ACCESSED

VARIANT

Ein JSON-Array mit Datenobjekten wie Tabellen, Ansichten und Spalten, die direkt in der Abfrage explizit oder durch Verwendung von Shortcuts wie dem Sternchen (d. h. *) benannt werden. In diesem Feld können virtuelle Spalten zurückgegeben werden.

BASE_OBJECTS_ACCESSED

VARIANT

Ein JSON-Array mit allen Basisdatenobjekten, insbesondere Spalten von Tabellen, die die Abfrage ausführen sollen. . Hinweis: In diesem Feld werden niemals Ansichtsnamen oder Ansichtsspalten, einschließlich virtueller Spalten, angegeben.

Die Abfrage in Snowflake und die Methode für die Erstellung der Datenbankobjekte bestimmen die Informationen, die Snowflake für DIRECT_OBJECTS_ACCESSED und BASE_OBJECTS_ACCESSED zurückgibt.

Betrachten Sie zum Beispiel die folgende Reihe von Objekten: base_table » view_1 » view_2 » view_3.

Wenn eine Abfrage auf view_2 erfolgt, gibt Snowflake view_2 als DIRECT_OBJECTS_ACCESSED zurück, weil view_2 in der Abfrage angegeben wurde. Die base_table wird als BASE_OBJECTS_ACCESSED protokolliert, da dies die ursprüngliche Quelle der Daten in view_2 ist.

In diesem Beispiel sollten view_1 und view_3 nicht in DIRECT_OBJECTS_ACCESSED und BASE_OBJECTS_ACCESSED enthalten sein, da keine dieser Ansichten in der Abfrage enthalten war und sie nicht das Basisobjekt sind, das als Quelle für die Daten in view_2 dient.

Die Felder für DIRECT_OBJECTS_ACCESSED und BASE_OBJECTS_ACCESSED werden im Folgenden beschrieben.

Feld

Datentyp

Beschreibung

columnId

NUMBER

Eine Spalte-ID, die innerhalb des Kontos eindeutig ist. Dieser Wert ist identisch mit der columnID in der Ansicht COLUMNS.

columnName

TEXT

Der Name der Spalte, auf die zugegriffen wurde.

objectId

NUMBER

Ein Bezeichner für das Objekt, der innerhalb eines gegebenen Kontos und einer gegebenen Domäne eindeutig ist. . Diese Nummer stimmt mit der TABLE_ID-Nummer einer Tabelle, Ansicht oder materialisierten Ansicht überein. . Siehe objectDomain.

objectName

TEXT

Der vollqualifizierte Name des Objekts, auf das zugegriffen wurde.

objectDomain

TEXT

Eine der folgenden Optionen: TABLE, VIEW, MATERIALIZED_VIEW, EXTERNAL_TABLE, STREAM.

Ein JSON-Array könnten beispielsweise wie folgt aussehen:

[
  {
    "objectDomain": <string>,
    "objectName": <string>,
    "objectId": <number>,
    "columns": [
      {
        "columnName": <string>,
        "columnId": <number>
      },
      {
        "columnName": <string>,
        "columnId": <number>
      },
        ...
      ]
  },
  ...
]

Nutzungshinweise

  • Die Ansicht enthält Daten ab dem 22. Februar 2021 an.

  • Diese Ansicht unterstützt Lese-Abfragen des folgenden Typs:

    • SELECT, einschließlich CREATE TABLE … AS SELECT (d. h. CTAS).

      • Snowflake erfasst SELECT-Unterabfragen von CTAS-Operationen.

    • CREATE TABLE … CLONE

      • Snowflake erfasst die Quelltabelle in einer CLONE-Operation.

    • COPY INTO … TABLE

      • Snowflake protokolliert diese Abfrage nur dann, wenn die Tabelle in einer FROM-Klausel als Quelle angegeben wird.

    • DML-Operationen, die Daten lesen (z. B. enthalten eine SELECT-Unterabfrage, geben bestimmte Spalten in WHERE oder JOIN an): INSERT … SELECT, UPDATE, DELETE und MERGE.

    • Benutzerdefinierte Funktionen (d. h. UDFs) und Tabellarische SQL-UDFs (UDTFs), wenn Tabellen innerhalb der Funktionen in Abfragen enthalten sind. Dies wird im Feld BASE_OBJECTS_ACCESSED protokolliert.

  • Diese Ansicht protokolliert nicht den Zugriff folgender Typen:

    • Schreiboperationen (z. B. INSERT, UPDATE, DELETE), TRUNCATE, Snowpipe und Tabellenmetadaten.

      Beispiel: Wenn eine Ansichtsspalte von einem externen Tokenisierungsdienst erzeugt wird, würden die Basisprotokolle keine Zugriffe auf diese Spalte enthalten, da die Daten nicht aus einer Snowflake-Tabelle stammen.

    • Tabellenfunktionen und andere Account Usage-Ansichten.

    • RESULT_SCAN zum Ermitteln vorheriger Ergebnisse.

  • Außerdem unterstützt diese Ansicht Folgendes nicht:

    • Sequenzen, einschließlich der Generierung neuer Werte.

    • Daten, die bei Verwendung einer externen Funktion in Snowflake eingehen oder Snowflake verlassen.

    • Zwischensichten, auf die zwischen der Basistabelle und dem direkten Objekt zugegriffen wird.

      Betrachten Sie zum Beispiel eine Abfrage auf Ansicht_A mit der folgenden Objektstruktur: Ansicht_A » Ansicht_B » Ansicht_C » Basistabelle.

      Die ACCESS_HISTORY-Ansicht erfasst die Abfrage auf Ansicht_A und auf die Basistabelle, aber nicht Ansicht_B und Ansicht_C.

  • Wenn ein Data Sharing-Anbieterkonto Objekte für Data Sharing-Verbraucherkonten über eine Freigabe freigibt:

    • Data Sharing-Anbieterkonten: Die Abfragen und Protokolle zu den freigegebenen Objekten, die im Anbieterkonto ausgeführt werden, sind für Data Sharing-Verbraucherkonten nicht sichtbar.

    • Data Sharing-Verbraucherkonten: Die im Verbraucherkonto ausgeführten Abfragen auf der Datenfreigabe werden protokolliert und sind nur für das Verbraucherkonto sichtbar, nicht für das Konto des Data Sharing-Anbieters. Die Basistabellen, auf die die Datenfreigabe zugreift, werden nicht protokolliert.

  • Sichere Ansichten. Der Protokollsatz enthält die zugrunde liegende Basistabelle (d. h. BASE_OBJECTS_ACCESSED) zum Generieren der Ansicht. Beispiele hierfür sind Abfragen auf andere Account Usage-Ansichten sowie Abfragen auf Basistabellen für Extraktions-, Transformations- und Ladeoperationen (d. h. ETL).

Beispiele

Gibt den Benutzerzugriffsverlauf zurück, sortiert nach Benutzer und Startzeit der Abfrage, beginnend mit dem letzten Zugriff.

SELECT user_name
       , query_id
       , query_start_time
       , direct_objects_accessed
       , base_objects_accessed
FROM access_history
ORDER BY 1, 3 desc
;

Die folgenden Beispiele helfen, die Einhaltung gesetzlicher Bestimmungen zu vereinfachen:

  • Fügen Sie den object_id-Wert hinzu, um festzustellen, wer in den letzten 30 Tagen auf eine sensible Tabelle zugegriffen hat:

    SELECT distinct user_name
    FROM access_history
         , lateral flatten(base_objects_accessed) f1
    WHERE f1.value:"objectId"::int=<fill_in_object_id>
    AND f1.value:"objectDomain"::string='Table'
    AND query_start_time >= dateadd('day', -30, current_timestamp())
    ;
    
  • Bestimmen Sie anhand des object_id-Wertes von 32998411400350, wann der Zugriff in den letzten 30 Tagen erfolgte:

    SELECT query_id
           , query_start_time
    FROM access_history
         , lateral flatten(base_objects_accessed) f1
    WHERE f1.value:"objectId"::int=32998411400350
    AND f1.value:"objectDomain"::string='Table'
    AND query_start_time >= dateadd('day', -30, current_timestamp())
    ;
    
  • Bestimmen Sie anhand des object_id-Wertes von 32998411400350, auf welche Spalten in den letzten 30 Tagen zugegriffen wurde:

    SELECT distinct f4.value AS column_name
    FROM access_history
         , lateral flatten(base_objects_accessed) f1
         , lateral flatten(f1.value) f2
         , lateral flatten(f2.value) f3
         , lateral flatten(f3.value) f4
    WHERE f1.value:"objectId"::int=32998411400350
    AND f1.value:"objectDomain"::string='Table'
    AND f4.key='columnName'
    ;