スキーマ:

ACCOUNT_USAGE

ACCESS_HISTORY ビュー

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

このセクションには3つのテーブルがあります。

  • 最初のテーブルは、各列の値の例を示しています。

  • 2番目のテーブルは、 ACCESS_HISTORY ビューの列を定義します。

  • 3番目のテーブルは、 base_objects_accesseddirect_objects_accessed、および objects_modified 列の JSON 配列のフィールドを定義します。

列名

query_id

a0fda135-d678-4184-942b-c3411ae8d1ce

query_start_time

2022-01-25 16:17:47.388 +0000

user_name

JSMITH

direct_objects_accessed

[
  {
    "objectDomain": "FUNCTION",
    "objectName": "GOVERNANCE.FUNCTIONS.RETURN_SUM",
    "objectId": "2",
    "argumentSignature": "(NUM1 NUMBER, NUM2 NUMBER)",
    "dataType": "NUMBER(38,0)"
  },
  {
    "columns": [
      {
        "columnId": 68610,
        "columnName": "CONTENT"
      }
    ],
    "objectDomain": "Table",
    "objectId": 66564,
    "objectName": "GOVERNANCE.TABLES.T1"
  }
]
Copy

base_objects_accessed

[
  {
    "objectDomain": "FUNCTION",
    "objectName": "GOVERNANCE.FUNCTIONS.RETURN_SUM",
    "objectId": "2",
    "argumentSignature": "(NUM1 NUMBER, NUM2 NUMBER)",
    "dataType": "NUMBER(38,0)"
  },
  {
    "columns": [
      {
        "columnId": 68610,
        "columnName": "CONTENT"
      }
    ],
    "objectDomain": "Table",
    "objectId": 66564,
    "objectName": "GOVERNANCE.TABLES.T1"
  }
]
Copy

objects_modified

[
  {
    "objectDomain": "STRING",
    "objectId":  NUMBER,
    "objectName": "STRING",
    "columns": [
      {
        "columnId": "NUMBER",
        "columnName": "STRING",
        "baseSources": [
          {
            "columnName": STRING,
            "objectDomain": "STRING",
            "objectId": NUMBER,
            "objectName": "STRING"
          }
        ],
        "directSources": [
          {
            "columnName": STRING,
            "objectDomain": "STRING",
            "objectId": NUMBER,
            "objectName": "STRING"
          }
        ]
      }
    ]
  },
  ...
]
Copy

object_modified_by_ddl

{
  "objectDomain": STRING,
  "objectName": STRING,
  "objectId": NUMBER,
  "operationType": STRING,
  "properties": ARRAY
}
Copy

policies_referenced

[
  {
    "columns": [
      {
        "columnId": 68610,
        "columnName": "SSN",
        "policies": [
          {
              "policyName": "governance.policies.ssn_mask",
              "policyId": 68811,
              "policyKind": "MASKING_POLICY"
          }
        ]
      }
    ],
    "objectDomain": "VIEW",
    "objectId": 66564,
    "objectName": "GOVERNANCE.VIEWS.V1",
    "policies": [
      {
        "policyName": "governance.policies.rap1",
        "policyId": 68813,
        "policyKind": "ROW_ACCESS_POLICY"
      }
    ]
  }
]
Copy

列名

データ型

説明

query_id

TEXT

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

query_start_time

TIMESTAMP_LTZ

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

user_name

TEXT

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

direct_objects_accessed

ARRAY

ユーザー定義関数(つまり、 UDFs および UDTFs)、ストアドプロシージャ、テーブル、ビュー、およびクエリで明示的に、またはアスタリスク(つまり *)を使用するなど、ショートカットを介して直接指定される列などのデータオブジェクトの JSON 配列。

このフィールドには仮想列を返すことができます。

UDFs に関するその他の注意事項については、 UDF の注意事項 (このトピック内)をご参照ください。

base_objects_accessed

ARRAY

列、外部関数、 UDFs、およびストアドプロシージャなど、クエリを実行するすべてのベースデータオブジェクトの JSON 配列。

この例では、最初の配列にあるフィールドで UDF が指定されています。最初の配列にあるこれらの同じフィールドは、該当する場合、ストアドプロシージャも指定します。

次に注意してください。

  • データ共有のコンシューマーアカウントで共有ビューにアクセスする場合、このフィールドはビュー名またはビュー列(仮想列を含む)を指定します。

  • UDFs に関するその他の注意事項については、 UDF の注意事項 (このトピック内)をご参照ください。

objects_modified

ARRAY

クエリの書き込み操作に関連付けられたオブジェクトを指定する JSON 配列。

UDF とストアドプロシージャの配列は、前に示したものと同じで、アクセス方法に応じて baseSourcesdirectSources の配列に表示されます。簡潔にするために、この例では UDF とストアドプロシージャ配列を省略しています。

UDFs に関するその他の注意事項については、 UDF の注意事項 (このトピック内)をご参照ください。

object_modified_by_ddl

OBJECT

データベース、スキーマ、テーブル、ビュー、および列に対する DDL 操作を指定します。これらの操作には、テーブルやビューに対する行アクセスポリシーを指定するステートメント、列に対するマスキングポリシーを指定するステートメント、オブジェクトや列に対するタグの更新(例: タグの設定、タグ値の変更)も含まれます。

policies_referenced

ARRAY

中間のオブジェクトまたは列に設定されたポリシーを含む、列に設定された強制マスキングポリシーとテーブルに設定された強制行アクセスポリシーに関する情報を指定します。

parent_query_id

TEXT

親ジョブのクエリ ID 、親ジョブがない場合は NULL 。

root_query_id

TEXT

チェーン内で一番上のジョブのクエリ ID 、そのジョブが親を持たない場合は NULL 。

direct_objects_accessedbase_objects_accessedobjects_modified、および policies_referenced 列の JSON 配列のフィールドについて以下で説明します。

フィールド

データ型

説明

columnId

NUMBER

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

columnName

TEXT

アクセスされた列の名前。ポリシーの場合は、マスキングポリシーが設定されている列名を指定します。

objectId

NUMBER

特定のアカウントおよびドメイン内で一意であるオブジェクトの識別子。この番号は一致します。

objectName

TEXT

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

マスキングポリシーが列に設定されている場合、または行アクセスポリシーがテーブルまたはビューに設定されている場合、値は、行アクセスポリシーが設定されているテーブルまたはビュー、またはその列の1つにマスキングポリシーが設定されているテーブルまたはビューの完全修飾名を参照します。

ステージにアクセスした場合、この値は次のようになります。

  • username (ユーザーステージ)

  • table_name (テーブルステージ)

  • stage_name (名前付きステージ)

objectDomain

TEXT

次のいずれかを使用します。 EXTERNAL TABLEFUNCTIONMATERIALIZED VIEWPROCEDURESTAGESTREAM、 または VIEW

FUNCTION は、UDFs、UDTFs、および外部関数を指定することに注意してください。

ポリシーの場合は、行アクセスポリシーが設定されているオブジェクトのドメインを指定します。

location

TEXT

データアクセスが外部ロケーション(例: s3://mybucket/a.csv)の場合における外部ロケーションの URL。 . クエリがステージにアクセスしない場合、このフィールドは省略されます。

stageKind

TEXT

ステージに書き込むときは、次のいずれかです: Table | User | Internal Named | External Named クエリがステージにアクセスしない場合、このフィールドは省略されます。

baseSources

TEXT

directSources で指定された列のソース列として機能する列。これらの列により、列系統を支援します。

directSources

TEXT

データが書き込まれるターゲットテーブルのソース列として機能する、 SQL ステートメントのデータ 書き込み 部分で特に言及されている列。これらの列により、列系統を支援します。

policyName

TEXT

パイプの完全修飾名。

policyId

NUMBER

特定のアカウントおよびドメイン内で一意であるポリシーの識別子。この値は、 MASKING_POLICIES ビュー にあるマスキングポリシーの識別子、または ROW_ACCESS_POLICIES ビュー にある行アクセスポリシーの識別子と一致します。

policyKind

TEXT

MASKING_POLICY または ROW_ACCESS_POLICY のいずれか

argumentSignature

TEXT

UDF またはストアドプロシージャにある各引数の名前とデータ型。

dataType

UDF またはストアドプロシージャの戻り値のデータ型。

この値は、同じ名前で戻り値の型が異なる2つ以上の UDFs を区別するのに役立ちます。

object_modified_by_ddl 列のフィールドは以下の説明のとおりです。

fieldName

データ型

説明

objectDomain

TEXT

DDL 操作によって定義または変更されたオブジェクトのドメイン。これには、 タグ付け可能なすべてのオブジェクトMASKING POLICY | ROW ACCESS POLICY | TAG が含まれます。

objectId

NUMBER

特定のアカウントおよびドメイン内で一意であるオブジェクトの識別子。DDL 操作によって定義および変更されます。

objectName

TEXT

DDL 操作によって定義または変更されるオブジェクトの完全修飾名。

operationType

TEXT

テーブル、ビュー、または列に対する操作を指定する SQL キーワード: ALTER | CREATE | DROP | REPLACE | UNDROP

properties

ARRAY

オブジェクトや列を作成、変更、ドロップまたはドロップ解除するときにオブジェクトまたは列のプロパティを指定する JSON 配列。プロパティにはアトミックと複合の2種類があります。

properties フィールドの場合は、

  • アトミック: プロパティごとに1つの値(例: comment は1つの文字列値を持ち、 enabled プロパティはブール値であり、1つの値を持ちます)。

  • 複合: プロパティに複数の値(例: タグの allowed_values、マスキングポリシー)。

複合プロパティは JSON 配列に記録されます。たとえば、テーブルに EMAIL という名前の列が1つある場合、その列は以下のように記録されます。

columns: {
  "email": {
    objectId: {
      "value": 1
    },
    "subOperationType": "ADD"
  }
}
Copy

subOperationType の値は、次のいずれかになります。

  • ADD は、複合プロパティの追加を指定します(例: 列を追加、許容値を設定)。

  • DROP は、複合プロパティの削除を指定します。

  • ALTER は、複合プロパティの変更を指定します。

objectId は、識別子を持たないタグ値を除いて、列またはオブジェクトの識別子を指定します。

使用上の注意

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

  • ビューの待機時間は最大180分(3時間)です。

先祖クエリ:

parent_query_id 列と root_query_id 列は、 2023_08 動作変更バンドルがデフォルトで有効に移行したことに基づいて、Snowflakeアカウントが更新された時期に応じて、2024年1月15~16日からデータの記録を開始します。この日付は、ビュー内の次の記録を区別するために必要です。

  • バンドルがデフォルトで有効になる前に実行されたクエリ。

  • この機能がデフォルトで有効になった後に実行されたクエリで、 parent_query_id に値がないもの。

ハイブリッドテーブル:

ハイブリッドテーブルに対してのみ動作する短時間実行クエリでは、 QUERY_HISTORY ビュー、 QUERY_HISTORY、または QUERY_HISTORY テーブル関数の出力に記録が生成されなくなりました。このようなクエリをモニターするには、 AGGREGATE_QUERY_HISTORY を使用します。

このようなクエリのアクセス履歴をモニターするには、 AGGREGATE_ACCESS_HISTORY を使用します。このビューでは、アクセス履歴の高スループットの運用ワークロードをより簡単にモニターできます。

一般的なメモ:
  • パフォーマンスを向上させるには、 query_start_time 列でクエリをフィルターし、より狭い時間範囲を選択します。サンプルクエリについては、 ACCESS_HISTORY ビューのクエリ をご参照ください。

  • セキュアビュー。ログ記録には、ビューを生成するための基になるベーステーブル(つまり、 base_objects_accessed)が含まれています。例には、他のAccount Usageビューや組織の使用状況ビューに対するクエリや、抽出、変換、およびロード(つまり、 ETL)操作用のベーステーブルに対するクエリが含まれます。

  • QUERY_HISTORY ビューの記録が、常に ACCESS_HISTORY ビューに記録されるとは限りません。SQL ステートメントの構造によって、Snowflakeが ACCESS_HISTORY ビューにエントリを記録するかどうかが決まります。

  • このビューのクエリ中に USING 句を指定すると、参照されていない列が direct_objects_accessed フィールドに記録される場合があります。回避策として、 USING 句を JOIN ... ON ... 句に置き換えます。詳細については、次をご参照ください。

読み取りクエリのメモ:

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

  • 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 UDFs (UDTFs)。これは base_objects_accessed フィールドでログに記録されます。

    UDFs の詳細については、 UDF のメモ (このトピック内)をご参照ください。

書き込み操作のメモ:

このビューは、次の型の 書き込み 操作をサポートします。

  • GET <内部ステージ>

  • PUT <内部ステージ>

  • DELETE

  • TRUNCATE

  • INSERT

    • INSERT INTO ... FROM SELECT *

    • INSERT INTO TABLE ... VALUES ()

  • MERGE INTO ... FROM SELECT *

  • UPDATE

    • UPDATE TABLE ... FROM SELECT * FROM ...

    • UPDATE TABLE ... WHERE ...

  • データのロードステートメント:

    • COPY INTO TABLE FROM internalStage

    • COPY INTO TABLE FROM externalStage

    • COPY INTO TABLE FROM externalLocation

  • データのアンロードステートメント:

    • COPY INTO internalStage FROM TABLE

    • COPY INTO externalStage FROM TABLE

    • COPY INTO externalLocation FROM TABLE

  • CREATE:

    • CREATE DATABASE ... CLONE

    • CREATE SCHEMA ... CLONE

    • CREATE TABLE ... CLONE

    • CREATE TABLE ... AS SELECT

  • CASE 関数を呼び出してアクセスする列を決定する書き込み操作(SELECT クエリで CASE 関数を使用した CTAS ステートメントなど)では、 CTAS ステートメントの記述方法に応じて、すべての CASE 分岐で参照されるすべての列が、 base_objects_accessed 列、 direct_objects_accessed 列、または両方の列で記録されます。

データ共有のメモ:

データ共有のプロバイダーアカウントが、共有を介してデータ共有のコンシューマーアカウントにオブジェクトを共有する場合、

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

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

    たとえば、プロバイダーがテーブルとテーブルから構築されたビューをコンシューマーアカウントに共有し、共有ビューにクエリがある場合、Snowflakeは base_objects_accessed 列に共有ビューアクセスを記録します。 columnNameobjectName の値を含むこの記録により、コンシューマーは自分のアカウントでアクセスされたオブジェクトを知ることができます。また、基になるテーブル(objectIdcolumnId を介して)はコンシューマーに公開されないため、プロバイダーも保護されます。

  • 列系統では、

    データ共有プロバイダーが、データ共有コンシューマーにビューを利用できるようにする場合、ビューのソース列はデータ共有プロバイダーに由来するため、コンシューマーには表示されません。

    データ共有コンシューマーがデータを共有ビューからテーブルに移動する場合、Snowflakeは新しく作成されたテーブルのビュー列を baseSources として記録しません。

  • 共有 UDFs および UDTFs の場合、

    • コンシューマーアカウントでは、ローカル ACCESS_HISTORY ビューは、共有 UDF/UDTF がコンシューマーによって呼び出されたときに、プロバイダーによって共有された UDF/UDTF を記録します。

    • プロバイダーアカウントでは、ローカル ACCESS_HISTORY ビューは、共有 UDF/UDTF のプロバイダーの使用状況を記録します。コンシューマーアカウントのユーザーは、プロバイダーアカウントが共有 UDF/UDTF をどのように使用しているかを表示できません。

  • ポリシー参照を追跡する場合、

    policies_referenced 列には、データをクエリするアカウントにローカルなポリシーが含まれています。

    プロバイダーがポリシーで保護されたテーブルを共有し、コンシューマーがこのテーブルにアクセスする場合、コンシューマーはプロバイダーがテーブルまたはその列に設定したポリシーを表示できません。

    コンシューマーが共有オブジェクトからビュー(v1)を作成し、ビュー(v1)またはその列にポリシーを設定し、コンシューマーアカウントのユーザーが保護されたビュー(v1)または保護されたビュー(v1)から作成された別のビュー(v2)にアクセスする場合、コンシューマーアカウントの ACCESS_HISTORY ビューには、ビュー(v1)とその列を保護するポリシーが含まれます。プロバイダーは、 v1 に対応する記録を表示できません。

Snowflake Native App Framework メモ:

Snowflake Native App に関連するクエリの一部は編集されています。詳細については、 SQL コマンドとビューからマスキングされた情報 をご参照ください。

タグベースのマスキングメモ:

ユーザーが タグベースのマスキングポリシー で保護されたテーブルまたはビューにアクセスする場合は、Snowflakeが保護された列にマスキングポリシーを適用すると、 policies_referenced 列にはタグを介して適用されるマスキングポリシーが含まれます。

ACCESS_HISTORY ビューには、タグ情報は記録されません。

UDFs およびストアドプロシージャのメモ:

これらの注意事項は、すべての言語の外部関数 UDFs および UDTFs に適用されます。これには、これらの関数が SECURE プロパティを持ち、所有者の権限と呼び出し元の権限を持つストアドプロシージャがある場合も含まれます。

列の詳細:

  • direct_objects_accessed 列には、クエリでこれらの関数とプロシージャが明示的に言及されていることが記録されます。

    Snowflakeは、ネストされた UDFs (つまり、別の UDFの定義で言及されている UDF)をこの列に記録しません。

  • base_objects_accessed 列には、クエリで呼び出される外部関数、共有関数、非 SQL UDFs、およびストアドプロシージャが記録されます。

  • objects_modified 列は次を記録します。

    • 関数を呼び出した結果が、別の列に結果をコピーするときの UDF/UDTF。

    • UDF、 UDTF、および外部関数は、クエリの記述方法に応じて、 baseSources および directSources の配列に記録できます。

サポート対象外:

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

  • Snowflakeが提供する テーブル関数Account Usage ビュー、 組織の使用状況 ビュー。

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

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

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

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

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

  • ストリームを更新するための操作。

  • 複製に起因するデータの移動。

使用上の注意: 列系統

これらの追加の注意事項は、列系統に関連しています。

サポートされている操作:

列系統は、次の SQL 操作の詳細を追跡します。

クエリ条件:
  • クエリプロファイル/プラン

    Snowflakeが書き込むクエリプランは、 ACCESS_HISTORY ビューに列系統を含めるかどうかを決定します。クエリプランの一部として列を評価する必要がある場合、クエリプランの最終結果として列が最終結果に含まれていない場合でも、Snowflakeは ACCESS_HISTORY ビューに列を含めます。

    たとえば、特定の列値に対する WHERE 句を含む次の INSERT ステートメントについて考えます。

    insert into a(c1)
    select c2
    from b
    where c3 > 1;
    
    Copy

    WHERE 句が FALSE と評価された場合でも、Snowflake は c2 列を c1 列のソース列として記録します。 c3 列は、 baseSources または directSources のソース列としてリストされません。

  • マスクされた列:

    • マスクされた列は常に directSources フィールドにリストされます。

    • baseSources フィールドの記録は、ポリシー定義によって異なります。例:

      • マスキングポリシー条件で CASE 関数を使用する場合は、各 CASE ブランチで参照されるすべての列が baseSources フィールドに記録されます。

      • マスキングポリシー条件が定数値(例: *****)のみを指定する場合、 baseSources フィールドは空です。

  • UDFs:

    • 列を引数として UDF に渡し、結果を別の列に書き込む場合、引数として渡された列は directSources フィールドに記録されます。例:

      insert into A(col1) select f(col2) from B;
      
      Copy

      この例では、列が f という名前の UDF の引数であるため、Snowflakeは directSources フィールドに col2 を記録します。

    • baseSources フィールドの記録は、 UDF 定義に依存します。

ビュー列:

ビュー列はソース列とは見なされず、ビュー列のデータがテーブル列にコピーされる場合は baseSources フィールドにリストされません。この場合のビュー列は directSources フィールドにリストされます。

EXISTS サブクエリ:

EXISTS サブクエリ句で参照される列は、ソース列とは見なされません。

使用上の注意: object_modified_by_ddl

  • IF [ NOT ] EXISTS 句: object_modified_by_ddl 列は、オブジェクトを作成または変更する際に、 CREATE または REPLACE のみを記録します。

  • Snowflakeは、次のオブジェクトドメインをサポートしています。

    • テーブルおよび外部テーブル。

    • ビューおよびマテリアライズドビュー

    • スキーマ

    • データベース。

列は、以下の SQL 操作に基づいてこれらの変更を記録します。DROP と UNDROP 操作はテーブルとビューに適用され、列には適用されません。

CREATE OR REPLACE

ALTER ... { SET | UNSET }

ALTER ... ADD ROW ACCESS POLICY

ALTER ... DROP ROW ACCESS POLICY

ALTER ... DROP ALL ROW ACCESS POLICIES

DROP | UNDROP
Copy

次のテーブルは、 DDL 操作、サポートされるドメイン、Snowflakeが記録するプロパティの間の関係をまとめたものです。

操作

ドメイン

プロパティ

メモ

CREATE [ OR REPLACE ]

TABLE | EXTERNAL TABLE | VIEW | MATERIALIZED VIEW

列名、列識別子。

CREATE DATABASE および CREATE SCHEMA 操作には記録されたプロパティはありません。

CREATE

TABLE ... { AS SELECT | USING TEMPLATE | LIKE | CLONE }

列名、列識別子。

Snowflakeは、 LIKE および CLONE 操作の作成ソースを記録します。

ソースオブジェクトが共有の場合、または USING TEMPLATE を使用している場合、Snowflakeは作成ソースを記録しません。

ALTER ... RENAME TO

ALTER TABLE ... RENAME COLUMN

TABLE | VIEW | MATERIALIZED VIEW | DATABASE | SCHEMA

オブジェクトまたは列の新しい名前。

ALTER ... SWAP WITH

TABLE | SCHEMA | DATABASE

objectName、objectId、objectDomain

ビューには2つの記録(スワップターゲットごとに1つ)の記録があります。各記録には同じクエリ識別子値が含まれます。

ALTER ... { ADD | DROP } COLUMN

TABLE

列名、列識別子、および ADD または DROP subOperationType。

DROP

TABLE | VIEW | MATERIALIZED VIEW | DATABASE | SCHEMA

Snowflakeはこれらの操作のプロパティを記録しません。

UNDROP

TABLE | SCHEMA | DATABASE

Snowflakeはこれらの操作のプロパティを記録しません。