USERS 和 QUERY_HISTORY 视图 (ACCOUNT_USAGE) 及 QUERY_HISTORY 函数:新列(待定)

注意

此行为变更包含在 2024_08 捆绑包中。

有关捆绑包的当前状态,请参阅 捆绑包历史记录

启用此行为变更捆绑包后,USERSQUERY_HISTORY 视图及 QUERY_HISTORY 函数的输出将包括以下新列。

USERS 视图 (ACCOUNT_USAGE)

如果 用户 TYPE 是 SNOWFLAKE_SERVICE,则表示该用户为 服务用户,此时以下新列会提供服务的数据库和架构信息。否则这些列将为空。

列名称

类型

描述

DATABASE_NAME

VARCHAR

当用户 TYPE 是 SNOWFLAKE_SERVICE 时,它会指定服务的数据库名称;否则就是 NULL。

DATABASE_ID

NUMBER

当用户 TYPE 是 SNOWFLAKE_SERVICE 时,它会为服务的数据库指定 Snowflake 生成的内部标识符;否则就是 NULL。

SCHEMA_NAME

VARCHAR

当用户类型为 SNOWFLAKE_SERVICE 时,它会指定服务的架构名称;否则就是 NULL。

SCHEMA_ID

NUMBER

当用户类型是 SNOWFLAKE_SERVICE 时,它会为服务的架构指定 Snowflake 生成的内部标识符;否则就是 NULL。

QUERY_HISTORY 视图 (ACCOUNT_USAGE)

如果 QUERY_HISTORY USER_TYPE 是 SNOWFLAKE_SERVICE,则表示查询由 Snowpark Container Services 服务执行,此时其他列提供该服务的数据库和架构信息。

列名称

类型

描述

USER_TYPE

VARCHAR

指定执行查询的用户的类型。它与用户实体上的 type 字段相同(请参阅 USERS 视图)。如果 Snowpark Container Services 服务执行查询,则用户类型为 SNOWFLAKE_SERVICE。

USER_DATABASE_NAME

VARCHAR

user_type 列中的值为 SNOWFLAKE_SERVICE 时,它会指定服务的数据库名称;否则就是 NULL。

USER_DATABASE_ID

NUMBER

user_type 列中的值为 SNOWFLAKE_SERVICE 时,它会指定 Snowflake 为该服务的数据库生成的内部标识符;否则就是 NULL。

USER_SCHEMA_NAME

VARCHAR

user_type 列中的值为 SNOWFLAKE_SERVICE 时,它会指定服务的架构名称;否则就是 NULL。

USER_SCHEMA_ID

NUMBER

user_type 列中的值为 SNOWFLAKE_SERVICE 时,它会指定 Snowflake 为服务架构生成的内部标识符,否则就是 NULL。

QUERY_HISTORY 函数

以下新列将添加到输出中(请参阅 QUERY_HISTORY 函数)。它们用于标识用户类型 (USER_TYPE)。如果 USER_TYPE 是 SNOWFLAKE_SERVICE,则其他列用于标识服务的数据库和架构。

列名称

类型

描述

USER_TYPE

VARCHAR

指定执行查询的用户的类型。它与用户实体上的 type 字段相同(请参阅 USERS 视图)。如果 Snowpark Container Services 服务执行查询,则用户类型为 SNOWFLAKE_SERVICE。

USER_DATABASE_NAME

VARCHAR

user_type 列中的值为 SNOWFLAKE_SERVICE 时,它会指定服务的数据库名称;否则就是 NULL。

USER_SCHEMA_NAME

VARCHAR

user_type 列中的值为 SNOWFLAKE_SERVICE 时,它会指定服务的架构名称;否则就是 NULL。

示例

该服务的数据库和架构信息以及用户名(对于 SNOWFLAKE_SERVICE 用户 type 而言,这也是服务名称)可在调试期间提供帮助。例如,您可以编写一个查询,检索与执行查询的服务相关的信息。下面提供了一些示例查询:

示例 1: 提取一项服务运行的查询。

SELECT query_history.*
FROM snowflake.account_usage.query_history
WHERE user_type = 'SNOWFLAKE_SERVICE'
AND user_name = '<service-name>'
AND user_database_name = '<service-db-name>'
AND user_schema_name = '<service-schema-name>'
order by start_time;
Copy

在 WHERE 子句中:

  • user_name = '<服务名称>',因为服务以 服务用户 的身份执行查询,并且服务用户的名称与服务名称相同。

  • user_type = 'SNOWFLAKE_SERVICE'user_name = '<服务名称>' 仅检索一项服务执行的查询。

  • 对于服务用户而言,user_database_nameuser_schema_name 名称是服务的数据库和架构。

通过查询 information_schema.query_history 函数,您可以获得同样的结果。

SELECT *
FROM TABLE(<any-user-db-name>.information_schema.query_history())
WHERE user_database_name = '<service-db-name>'
AND user_schema_name = '<service-schema-name>'
AND user_type = 'SNOWFLAKE_SERVICE'
AND user_name = '<service-name>'
order by start_time;
Copy

在 WHERE 子句中:

  • user_type = 'SNOWFLAKE_SERVICE'user_name = '<服务名称>' 仅检索一项服务执行的查询。

  • 对于服务用户而言,user_database_nameuser_schema_name 名称是服务的数据库和架构。

示例 2: 获取多项服务运行的查询和相应的服务信息。

SELECT query_history.*, services.*
FROM snowflake.account_usage.query_history
JOIN snowflake.account_usage.services
ON query_history.user_name = services.service_name
AND query_history.user_schema_id = services.service_schema_id
AND query_history.user_type = 'SNOWFLAKE_SERVICE'
Copy

该查询联接 QUERY_HISTORY 和 SERVICES 视图,以检索与查询和执行查询的服务相关的信息。请注意以下事项:

  • 对于由服务运行的查询,query_history.user_name 是服务用户的名称,与服务名称相同。

  • 该查询使用架构 IDs(而非架构名称)联接视图,以确保您引用相同的架构,因为如果删除并重新创建架构,架构 ID 会发生变化,但名称保持不变。

您可以向查询添加可选的筛选器。例如:

  • 筛选 query_history,从而仅检索执行特定查询的服务。

  • 筛选 services,从而仅检索特定服务执行的查询。

示例 3: 获取每项服务的服务用户信息。

SELECT services.*, users.*
FROM snowflake.account_usage.users
JOIN snowflake.account_usage.services
ON users.name = services.service_name
AND users.schema_id = services.service_schema_id
AND users.type = 'SNOWFLAKE_SERVICE'
Copy

查询在 ACCOUNT_USAGE 架构中联接 SERVICES 和 USERS 视图,以检索服务和服务用户信息。请注意以下事项:

  • 当服务运行查询时,它会以服务用户身份运行查询,服务用户名与服务名称相同。因此,您可以指定联接条件:users.name = services.service_name

  • 服务名称仅在一个架构内唯一。因此,该查询指定联接条件 (users.schema_id = services.service_schema_id),以确保每个服务用户均与其所属的特定服务(而非在不同架构中运行的任何其他同名服务)相匹配。

参考:1771

语言: 中文