スキーマ:

ACCOUNT_USAGE

ACCESS_HISTORY ビュー

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

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

  • 最初のテーブルは、 ACCESS_HISTORY ビューの列を定義します。

  • 2番目のテーブルは、 BASE_OBJECTS_ACCESSED、 DIRECT_OBJECTS_ACCESSED、および OBJECTS_MODIFIED 列の JSON 配列のフィールドを定義します。

列名

データ型

説明

QUERY_ID

TEXT

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

a0fda135-d678-4184-942b-c3411ae8d1ce

QUERY_START_TIME

TIMESTAMP_LTZ

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

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

USER_NAME

TEXT

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

JSMITH

DIRECT_OBJECTS_ACCESSED

ARRAY

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

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

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

[
  {
    "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

ARRAY

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

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

次に注意してください。

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

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

[
  {
    "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

ARRAY

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

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

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

[
  {
    "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

OBJECT

この列は、将来の機能用プレースホルダーです。

POLICIES_REFERENCED

ARRAY

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

[
  {
    "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

DIRECT_OBJECTS_ACCESSED、 BASE_OBJECTS_ACCESSED、 OBJECTS_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、および外部関数を指定することに注意してください。

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

位置

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 を区別するのに役立ちます。

使用上の注意

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

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

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

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

  • Account Usage 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が保護された列にマスキングポリシーを適用すると、 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 サブクエリ句で参照される列は、ソース列とは見なされません。