USERS 和 QUERY_HISTORY 视图 (ACCOUNT_USAGE) 及 QUERY_HISTORY 函数:新列(待定)¶
启用此行为变更捆绑包后,USERS 和 QUERY_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 |
指定执行查询的用户的类型。它与用户实体上的 |
USER_DATABASE_NAME |
VARCHAR |
当 |
USER_DATABASE_ID |
NUMBER |
当 |
USER_SCHEMA_NAME |
VARCHAR |
当 |
USER_SCHEMA_ID |
NUMBER |
当 |
QUERY_HISTORY 函数¶
以下新列将添加到输出中(请参阅 QUERY_HISTORY 函数)。它们用于标识用户类型 (USER_TYPE)。如果 USER_TYPE 是 SNOWFLAKE_SERVICE,则其他列用于标识服务的数据库和架构。
列名称 |
类型 |
描述 |
---|---|---|
USER_TYPE |
VARCHAR |
指定执行查询的用户的类型。它与用户实体上的 |
USER_DATABASE_NAME |
VARCHAR |
当 |
USER_SCHEMA_NAME |
VARCHAR |
当 |
示例¶
该服务的数据库和架构信息以及用户名(对于 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;
在 WHERE 子句中:
user_name = '<服务名称>'
,因为服务以 服务用户 的身份执行查询,并且服务用户的名称与服务名称相同。user_type = 'SNOWFLAKE_SERVICE'
和user_name = '<服务名称>'
仅检索一项服务执行的查询。对于服务用户而言,
user_database_name
和user_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;
在 WHERE 子句中:
user_type = 'SNOWFLAKE_SERVICE'
和user_name = '<服务名称>'
仅检索一项服务执行的查询。对于服务用户而言,
user_database_name
和user_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'
该查询联接 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'
查询在 ACCOUNT_USAGE 架构中联接 SERVICES 和 USERS 视图,以检索服务和服务用户信息。请注意以下事项:
当服务运行查询时,它会以服务用户身份运行查询,服务用户名与服务名称相同。因此,您可以指定联接条件:
users.name = services.service_name
。服务名称仅在一个架构内唯一。因此,该查询指定联接条件 (
users.schema_id = services.service_schema_id
),以确保每个服务用户均与其所属的特定服务(而非在不同架构中运行的任何其他同名服务)相匹配。
参考:1771