ACCESS_HISTORY ビュー

このAccount Usageビューを使用して、過去365日(1年)以内のSnowflakeオブジェクト(例: テーブル、ビュー、列)のアクセス履歴をクエリできます。

列名

データ型

説明

QUERY_ID

TEXT

SQL ステートメントのための内部、システム生成識別子。この値は QUERY_HISTORY ビュー にも記載されています。

QUERY_START_TIME

TIMESTAMP_LTZ

ステートメントの開始時刻(UTC タイムゾーン)。

USER_NAME

TEXT

クエリを発行したユーザー。

DIRECT_OBJECTS_ACCESSED

VARIANT

テーブル、ビュー、列などのデータオブジェクトの JSON 配列は、クエリで明示的に、またはアスタリスク(つまり *)を使用するなどのショートカットを介して直接指定されます。このフィールドには仮想列を返すことができます。

BASE_OBJECTS_ACCESSED

VARIANT

すべての基本データオブジェクトの JSON 配列、具体的には、クエリを実行するためのテーブルの列。 . 注: このフィールドが、仮想列などのビュー名またはビュー列を指定することはありません。

Snowflakeのクエリとデータベースオブジェクトの作成方法によって、Snowflakeが DIRECT_OBJECTS_ACCESSEDBASE_OBJECTS_ACCESSED に対して返す情報が決まります。

たとえば、次の一連のオブジェクトについて考えてみます。 base_table » view_1 » view_2 » view_3

view_2 でクエリが実行されると、クエリで view_2 が指定されているため、Snowflakeは view_2DIRECT_OBJECTS_ACCESSED として返します。 base_tableBASE_OBJECTS_ACCESSED としてログに記録されます。これは、 view_2 のデータの元ソースであるためです。

この例では、 view_1view_3DIRECT_OBJECTS_ACCESSEDBASE_OBJECTS_ACCESSED に含めません。これらのビューはどちらもクエリに含まれておらず、 view_2 のデータのソースとして機能するベースオブジェクトではないためです。

DIRECT_OBJECTS_ACCESSEDBASE_OBJECTS_ACCESSED のフィールドについて以下に説明します。

フィールド

データ型

説明

columnId

NUMBER

アカウント内で一意の列 ID。この値は、 COLUMNS ビューの columnID と同じです。

columnName

TEXT

アクセスされた列の名前。

objectId

NUMBER

特定のアカウントおよびドメイン内で一意であるオブジェクトの識別子。 . この番号は、 テーブルビュー、および マテリアライズドビューTABLE_ID 番号と一致します。 . objectDomain をご参照ください。

objectName

TEXT

アクセスされたオブジェクトの完全修飾名。

objectDomain

TEXT

次のいずれかを使用します。TABLE、 VIEW、 MATERIALIZED_VIEW、 EXTERNAL_TABLE、 STREAM。

以下は、 JSON 配列の例です。

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

使用上の注意

  • ビューには、2021年2月22日から始まるデータが表示されます。

  • このビューは、次のタイプの 読み取り クエリをサポートします。

    • SELECT、CREATE TABLE ... AS SELECT (つまり、 CTAS)を含む。

      • Snowflakeは、 CTAS 操作で SELECT サブクエリを記録します。

    • CREATE TABLE ... CLONE

      • Snowflakeは、 CLONE 操作でソーステーブルを記録します。

    • COPY INTO ... TABLE

      • Snowflakeは、テーブルが FROM 句でソースとして指定されている場合に 限り、このクエリをログに記録します。

    • DML データを読み取る操作(例: SELECT サブクエリを含み、 WHERE または JOIN の特定の列を指定): INSERT ... SELECT、 UPDATE、 DELETE、および MERGE。

    • 関数内のクエリにテーブルが含まれている場合は、 ユーザー定義関数 (つまり、UDFs)と SQL UDTFs (ユーザー定義のテーブル関数)。これは BASE_OBJECTS_ACCESSED フィールドでログに記録されます。

  • このビューは、次のタイプのアクセスをログに記録 しません

    • 書き込み操作(例: INSERT、 UPDATE、 DELETE)、 TRUNCATE、Snowpipe、テーブルメタデータ。

      たとえば、ビュー列が外部トークン化サービスによって生成された場合、データはSnowflakeテーブルからのものではないため、ベースログにはその列へのアクセスは含まれません。

    • テーブル関数 または他の アカウントの使用 ビュー。

    • RESULT_SCAN により、以前の結果を取得します。

  • さらに、このビューは次をサポートして いません

    • 新しい値の生成などの、 シーケンス

    • 外部関数の使用中にSnowflakeに出入りするデータ。

    • ベーステーブルと直接オブジェクトの間でアクセスされる中間ビュー。

      たとえば、次のオブジェクト構造を持つView_Aのクエリについて考えてみます。View_A » View_B » View_C » Base_Table。

      ACCESS_HISTORY ビューは、View_AとBase_Tableにクエリを記録しますが、View_BとView_Cには記録 しません

  • Data Sharingプロバイダーアカウントが共有を通じてData Sharingコンシューマーアカウントにオブジェクトを共有する場合、

    • Data Sharingプロバイダーアカウント: プロバイダーアカウントで実行された共有オブジェクトに対するクエリとログは、Data Sharingコンシューマーアカウントには表示されません。

    • Data Sharingコンシューマーアカウント: コンシューマーアカウントで実行されたデータ共有に対するクエリはログに記録されてコンシューマーアカウントにのみ表示され、Data Sharingプロバイダーアカウントには表示されません。データ共有によってアクセスされるベーステーブルはログに記録されません。

  • 安全なビュー。ログ記録には、ビューを生成するための基になるベーステーブル(つまり、 BASE_OBJECTS_ACCESSED)が含まれています。例には、他のアカウントAccount Usageビューに対するクエリや、抽出、変換、およびロード(つまり、 ETL)操作のためのベーステーブルに対するクエリが含まれます。

最新のアクセスから開始して、ユーザーとクエリの開始時刻の順にユーザーアクセス履歴を返します。

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

次の例は、コンプライアンス監査を容易にするために役立ちます。

  • object_id 値を追加して、過去30日間に機密テーブルにアクセスしたユーザーを特定します。

    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())
    ;
    
  • 32998411400350object_id 値を使用して、過去30日間にアクセスがあった時期を特定します。

    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())
    ;
    
  • 32998411400350object_id 値を使用して、過去30日間にアクセスされた列を特定します。

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