架构:

ACCOUNT_USAGE

ACCESS_HISTORY 视图

此 Account Usage 视图可用于查询 Snowflake 对象(例如表、视图、列)在过去 365 天(1 年)内的访问历史记录。

本部分有三个表:

  • 第一个表提供每个列值的示例。

  • 第二个表定义 ACCESS_HISTORY 视图中的列。

  • 第三个表定义 base_objects_accesseddirect_objects_accessedobjects_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

数据对象的 JSON 数组,例如用户定义的函数(即 UDFs 和 UDTFs)、存储过程、表、视图和列,这些对象直接在查询中显式命名,或者通过快捷方式(例如使用星号 *)命名。

虚拟列可以在此字段中返回。

有关 UDFs 的其他说明,请参阅 UDF 说明 (本主题内容)。

base_objects_accessed

ARRAY

要执行查询的所有基本数据对象的 JSON 数组,包括列、外部函数、UDFs 和存储过程。

在此示例中,第一个数组中的字段指定 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_modifiedpolicies_referenced 列的 JSON 数组中的字段。

字段

数据类型

描述

columnId

NUMBER

账户中唯一的列 ID。此值与 COLUMNS 视图中的 columnID 相同。

columnName

TEXT

访问的列的名称。对于策略,指定为其设置掩码策略的列。

objectId

NUMBER

对象的标识符,在给定账户和域中唯一。此数字将匹配:

  • 视图物化视图TABLE_ID 编号。

  • 如果访问了暂存区,则此数字将匹配:

    • 用户NAME 标识符(用户暂存区)。

    • TABLE_ID 编号(表暂存区)。

    • 暂存区 的``STAGE_ID`` 编号(命名暂存区)。

objectName

TEXT

所访问对象的完全限定名称。

如果对列设置掩码策略,或者对表或视图设置行访问策略,则该值指设置行访问策略的表或视图的完全限定名称,或者对其中一列设置掩码策略的表或视图的完全限定名称。

如果访问了暂存区,则此值将为:

  • ``username``(用户暂存区)。

  • ``table_name``(表暂存区)。

  • ``stage_name``(命名暂存区)。

objectDomain

TEXT

以下其中一项:EXTERNAL TABLEFUNCTIONMATERIALIZED VIEWPROCEDURESTAGESTREAMVIEW

请注意,FUNCTION 指定 UDFs、UDTFs 和外部函数。

对于策略,指定对其设置了行访问策略的对象所属的域。

location

TEXT

当数据访问是外部位置时,外部位置的 URL(例如 s3://mybucket/a.csv)。. 如果查询未访问暂存区,则忽略此字段。

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 或存储过程的返回值的数据类型。

此值有助于区分两个或多个具有相同名称但具有不同返回类型的 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 数组,用于在您创建、修改、删除或取消删除对象或列时指定对象或列属性。有两种类型的属性:原子性和复合性。

对于 properties 字段:

  • 原子性:每个属性有一个值(例如,comment 有一个字符串值,enabled 属性是布尔值,并且有一个值)。

  • 复合性:每个属性有多个值(例如 allowed_values 适用于标签、掩码策略)。

复合属性以 JSON 数组记录。例如,如果表包含名为 EMAIL 的单个列,则该列记录如下:

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

subOperationType 可以是以下其中一项:

  • ADD 指定添加复合属性(例如,添加列、设置允许的值)。

  • DROP 指定移除复合属性。

  • ALTER 指定修改复合属性。

objectId 指定列或对象的标识符,但没有标识符的允许标签值除外。

使用说明

延迟和历史数据:
  • 该视图显示从 2021 年 2 月 22 日起的数据。

  • 视图的延迟时间最长可达 180 分钟(3 小时)。

祖先查询:

从 2024 年 1 月 15 日至 16 日开始,parent_query_idroot_query_id 列开始记录数据,具体取决于您的 Snowflake 账户基于 2023_08 行为变更捆绑包过渡到默认启用的更新时间。此日期是区分视图中的以下记录所必需的:

  • 在捆绑包默认启用之前运行的查询。

  • 在功能默认启用之后运行但 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 和 Organization 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

    • 当表在 FROM 子句中指定为源时,Snowflake 才会记录此查询。

  • 读取数据的 DML 操作(例如,包含 SELECT 子查询、在 WHERE 或 JOIN 中指定某些列):INSERT ... SELECT、UPDATE、DELETE 和 MERGE。

  • UDFs 和 表格 SQL UDFs (UDTFs),如果函数内的查询包含表。这在 base_objects_accessed 字段中进行记录。

    有关 UDFs 的更多详细信息,请参阅 UDF 说明 (本主题内容)。

写入操作说明:

此视图支持以下类型的 写入 操作:

  • GET <internal_stage>

  • PUT <internal_stage>

  • 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 语句),每个 CASE 分支中引用的所有列都记录于 base_objects_accessed 列、direct_objects_accessed 列或这两列,具体取决于 CTAS 语句的写入方式。

数据共享说明:

如果数据共享提供商账户通过共享,将对象共享给数据共享使用者账户:

  • 提供商账户: 在提供商账户中执行的共享对象的查询和日志不对数据共享使用者账户可见。

  • 使用者账户: 对使用者账户中的数据共享执行的查询会记录下来,并且仅对使用者账户可见,而对数据共享提供商账户不可见。

    例如,如果提供商向使用者账户共享一个表和根据此表构建的视图,并且发生对该共享视图的查询,则 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 和外部函数可以在 baseSourcesdirectSources 的数组中记录,具体取决于查询的写入方式。

不支持:

此视图 记录以下类型的访问:

  • Snowflake 提供的 表函数Account Usage 视图和 Organization 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 视图中包含该列。

    例如,考虑以下 INSERT 语句,其中包含针对特定列值的 WHERE 子句:

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

    即使 WHERE 子句的计算结果为 FALSE,Snowflake 也会将 c2 列记录为 c1 列的源列。c3 列未列为 baseSourcesdirectSources 的源列。

  • 掩码列:

    • 掩码列始终在 directSources 字段中列出。

    • baseSources 字段中的记录取决于策略定义。例如:

      • 如果掩码策略条件使用 CASE 函数,则每个 CASE 分支中引用的所有列都在 baseSources 字段中记录。

      • 如果掩码策略条件仅指定一个常量值(例如 *****),则 baseSources 字段为空。

  • UDFs:

    • 将一列作为实参传递给 UDF 并将结果写入另一列时,作为实参传递的列在 directSources 字段中记录。例如:

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

      在此示例中,Snowflake 在 directSources 字段中记录 col2,因为该列是针对名为 f 的 UDF 的实参。

    • baseSources 字段中的记录取决于 UDF 定义。

视图列::

将视图列中的数据复制到表列时,视图列不被视为源列,并且不会在 baseSources 字段中列出。在本案例中,视图列在 directSources 字段中列出。

EXISTS 子查询:

EXISTS 子查询中引用的列不被视为源列。

使用说明:object_modified_by_ddl

  • IF [ NOT ] EXISTS 子句:object_modified_by_ddl 列仅在创建或修改对象时记录 CREATEREPLACE

  • 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

视图中有两条记录,每个交换目标对应一条。每条记录都包含相同的查询标识符值。

ALTER ... { ADD | DROP } COLUMN

TABLE

列名、列标识符和 ADD 或 DROP subOperationType。

DROP

TABLE | VIEW | MATERIALIZED VIEW | DATABASE | SCHEMA

Snowflake 不会记录这些操作的属性。

UNDROP

TABLE | SCHEMA | DATABASE

Snowflake 不会记录这些操作的属性。

语言: 中文