处理 SHOW 命令输出和 Snowflake 视图中的新列

SHOW <objects> 命令的输出和 Snowflake 视图(例如,SNOWFLAKE 数据库ACCOUNT_USAGE 架构 中的视图和 INFORMATION_SCHEMA 架构 中的视图)中会定期引入新列。

如果您的脚本或代码依赖于包含特定列数的结果集,或者依赖于列的顺序,则引入新列可能会影响该脚本或代码。

临时解决新列引入的问题

如果您的脚本或代码因引入新列而遇到问题,Snowflake 管理员(获得 ACCOUNTADMIN 角色授权的用户)可以更改为执行特定 SHOW 命令或 Snowflake 视图的 SELECT * 查询而返回的列。这些列称为 默认列

覆盖 SHOW 命令的默认列

要从 SHOW 命令的输出中排除新引入的列,请调用 SYSTEM$SET_DEFAULT_COLUMNS_OVERRIDE_FOR_SHOW_COMMAND 函数,指定对象类型和应返回的列的列表。

假设在 SHOW NOTIFICATION INTEGRATIONS 命令的输出中引入了新的 direction 列。为防止新的 direction 列包含在该命令的输出中,请调用 SYSTEM$SET_DEFAULT_COLUMNS_OVERRIDE_FOR_SHOW_COMMAND,指定 'NOTIFICATION INTEGRATIONS' 作为对象的类型。传入应在输出中返回的列的列表(该列表以逗号分隔,不包括 direction):

SELECT SYSTEM$SET_DEFAULT_COLUMNS_OVERRIDE_FOR_SHOW_COMMAND(
  'NOTIFICATION INTEGRATIONS',
  'name, type, category, enabled, comment, created_on'
);

当您账户中的任何人运行 SHOW NOTIFICATION INTEGRATIONS 命令时,输出中将不会返回新的 direction 列。

SHOW NOTIFICATION INTEGRATIONS;
+--------------------------------+---------+--------------+---------+---------+-------------------------------+
| name                           | type    | category     | enabled | comment | created_on                    |
|--------------------------------+---------+--------------+---------+---------+-------------------------------|
| SLACK_NOTIFICATION_INTEGRATION | WEBHOOK | NOTIFICATION | true    | NULL    | 2025-07-02 06:14:53.859 -0700 |
+--------------------------------+---------+--------------+---------+---------+-------------------------------+

重置 SHOW 命令的默认列

如果您需要撤销之前的 SYSTEM$SET_DEFAULT_COLUMNS_OVERRIDE_FOR_SHOW_COMMAND 调用,并针对特定对象类型在 SHOW 命令中返回所有列,请调用 SYSTEM$UNSET_DEFAULT_COLUMNS_OVERRIDE_FOR_SHOW_COMMAND 函数,指定对象的类型。例如:

SELECT SYSTEM$UNSET_DEFAULT_COLUMNS_OVERRIDE_FOR_SHOW_COMMAND(
  'NOTIFICATION INTEGRATIONS'
);

获取 SHOW 命令的默认列的列表

如果您需要确定是否针对特定对象类型调用了 SYSTEM$SET_DEFAULT_COLUMNS_OVERRIDE_FOR_SHOW_COMMAND,并且您希望在该命令的输出中返回列的列表,请调用 SYSTEM$GET_DEFAULT_COLUMNS_OVERRIDE_FOR_SHOW_COMMAND 函数,指定对象的类型。例如:

SELECT SYSTEM$GET_DEFAULT_COLUMNS_OVERRIDE_FOR_SHOW_COMMAND(
  'NOTIFICATION INTEGRATIONS'
);
+-------------------------------------------------------+
| SYSTEM$GET_DEFAULT_COLUMNS_OVERRIDE_FOR_SHOW_COMMAND( |
|   'NOTIFICATION INTEGRATIONS'                         |
| )                                                     |
|-------------------------------------------------------|
| name,type,category,enabled,comment,created_on         |
+-------------------------------------------------------+

如果之前没有调用过 SYSTEM$SET_DEFAULT_COLUMNS_OVERRIDE_FOR_SHOW_COMMAND,或者如果调用了 SYSTEM$UNSET_DEFAULT_COLUMNS_OVERRIDE_FOR_SHOW_COMMAND,则该函数返回空字符串。

SELECT SYSTEM$UNSET_DEFAULT_COLUMNS_OVERRIDE_FOR_SHOW_COMMAND(
  'NOTIFICATION INTEGRATIONS'
);

SELECT SYSTEM$GET_DEFAULT_COLUMNS_OVERRIDE_FOR_SHOW_COMMAND(
  'NOTIFICATION INTEGRATIONS'
);
+-------------------------------------------------------+
| SYSTEM$GET_DEFAULT_COLUMNS_OVERRIDE_FOR_SHOW_COMMAND( |
|   'NOTIFICATION INTEGRATIONS'                         |
| )                                                     |
|-------------------------------------------------------|
|                                                       |
+-------------------------------------------------------+

覆盖 Snowflake 视图的默认列

要从 Snowflake 视图的 SELECT * 查询结果中排除新引入的列,请调用 SYSTEM$SET_DEFAULT_COLUMNS_OVERRIDE_FOR_SYSTEM_OBJECT 函数,指定对象类型、包含该视图的数据库和架构、该视图的名称以及应返回的列的列表。

假设在 ACCOUNT_USAGE 架构 </sql-reference/account-usage/databases>` 的 DATABASES 视图中引入了新的 ``replicable_with_failover_groups` 列。为防止在该视图的 SELECT * 查询结果中返回新的 replicable_with_failover_groups 列,请调用 SYSTEM$SET_DEFAULT_COLUMNS_OVERRIDE_FOR_SYSTEM_OBJECT,指定 'VIEW' 作为对象类型,'SNOWFLAKE' 作为数据库,'ACCOUNT_USAGE' 作为架构,以及 'TABLES' 作为视图。传入应在输出中返回的列的列表(该列表以逗号分隔,不包括 replicable_with_failover_groups):

SELECT SYSTEM$SET_DEFAULT_COLUMNS_OVERRIDE_FOR_SYSTEM_OBJECT(
  'VIEW',
  'SNOWFLAKE',
  'ACCOUNT_USAGE',
  'DATABASES',
  'database_id, database_name, database_owner, is_transient, ' ||
  'comment, created, last_altered, deleted, retention_time, '  ||
  'resource_group, type, owner_role_type, object_visibility'
);

该示例使用 || 运算符构造字符串,其中包含以逗号分隔的列列表。

当您账户中的任何人执行 DATABASES 视图的 SELECT * 查询时,输出中将不会返回新的 replicable_with_failover_groups 列。

SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.DATABASES;
+-------------+---------------+----------------+--------------+---------+-------------------------------+-------------------------------+-------------------------------+----------------+----------------+----------+-----------------+-------------------+
| DATABASE_ID | DATABASE_NAME | DATABASE_OWNER | IS_TRANSIENT | COMMENT | CREATED                       | LAST_ALTERED                  | DELETED                       | RETENTION_TIME | RESOURCE_GROUP | TYPE     | OWNER_ROLE_TYPE | OBJECT_VISIBILITY |
|-------------+---------------+----------------+--------------+---------+-------------------------------+-------------------------------+-------------------------------+----------------+----------------+----------+-----------------+-------------------|
|          55 | MY_DATABASE   | NULL           | NO           | NULL    | 2025-07-16 15:17:55.990 -0700 | 2025-07-17 15:19:52.305 -0700 | 2025-07-16 15:18:32.973 -0700 |              1 | NULL           | STANDARD | NULL            | NULL              |
+-------------+---------------+----------------+--------------+---------+-------------------------------+-------------------------------+-------------------------------+----------------+----------------+----------+-----------------+-------------------+

如果您需要为 INFORMATION_SCHEMA 视图调用此函数,请为数据库名称传入空字符串。例如,要从 INFORMATION_SCHEMA 架构 </sql-reference/info-schema/databases>` 中的 DATABASES 视图的 :code:`SELECT * 查询结果中排除 replicable_with_failover_groups 列,请执行以下操作:

SELECT SYSTEM$SET_DEFAULT_COLUMNS_OVERRIDE_FOR_SYSTEM_OBJECT(
  'VIEW',
  '',
  'INFORMATION_SCHEMA',
  'DATABASES',
  'database_name, database_owner, is_transient, comment, ' ||
  'created, last_altered, retention_time, type, '          ||
  'owner_role_type'
);

重置 Snowflake 视图的默认列

如果您需要撤销之前的 SYSTEM$SET_DEFAULT_COLUMNS_OVERRIDE_FOR_SYSTEM_OBJECT 调用,并在 Snowflake 视图的 SELECT * 查询中返回所有列,请调用 SYSTEM$UNSET_DEFAULT_COLUMNS_OVERRIDE_FOR_SYSTEM_OBJECT 函数,指定对象类型、包含该视图的数据库和架构,以及该视图的名称。例如:

SELECT SYSTEM$UNSET_DEFAULT_COLUMNS_OVERRIDE_FOR_SYSTEM_OBJECT(
  'VIEW',
  'SNOWFLAKE',
  'ACCOUNT_USAGE',
  'DATABASES'
);

如果您需要为 INFORMATION_SCHEMA 视图调用此函数,请为数据库名称传入空字符串。例如:

SELECT SYSTEM$UNSET_DEFAULT_COLUMNS_OVERRIDE_FOR_SYSTEM_OBJECT(
  'VIEW',
  '',
  'INFORMATION_SCHEMA',
  'DATABASES'
);

获取 Snowflake 视图的默认列的列表

如果您需要确定是否针对特定视图调用了 SYSTEM$SET_DEFAULT_COLUMNS_OVERRIDE_FOR_SYSTEM_OBJECT,并且您希望在该视图的 SELECT * 查询中返回列的列表,请调用 SYSTEM$GET_DEFAULT_COLUMNS_OVERRIDE_FOR_SYSTEM_OBJECT 函数,指定对象类型、包含该视图的数据库和架构,以及该视图的名称。例如:

SELECT SYSTEM$GET_DEFAULT_COLUMNS_OVERRIDE_FOR_SYSTEM_OBJECT(
  'VIEW',
  'SNOWFLAKE',
  'ACCOUNT_USAGE',
  'DATABASES'
);
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+
| SYSTEM$GET_DEFAULT_COLUMNS_OVERRIDE_FOR_SYSTEM_OBJECT(                                                                                                          |
|   'VIEW',                                                                                                                                                       |
|   'SNOWFLAKE',                                                                                                                                                  |
|   'ACCOUNT_USAGE',                                                                                                                                              |
|   'DATABASES'                                                                                                                                                   |
| )                                                                                                                                                               |
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------|
| DATABASE_ID,DATABASE_NAME,DATABASE_OWNER,IS_TRANSIENT,COMMENT,CREATED,LAST_ALTERED,DELETED,RETENTION_TIME,RESOURCE_GROUP,TYPE,OWNER_ROLE_TYPE,OBJECT_VISIBILITY |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+

如果您需要为 INFORMATION_SCHEMA 视图调用此函数,请为数据库名称传入空字符串。例如:

SELECT SYSTEM$GET_DEFAULT_COLUMNS_OVERRIDE_FOR_SYSTEM_OBJECT(
  'VIEW',
  '',
  'INFORMATION_SCHEMA',
  'DATABASES'
);
+------------------------------------------------------------------------------------------------------------+
| SYSTEM$GET_DEFAULT_COLUMNS_OVERRIDE_FOR_SYSTEM_OBJECT(                                                     |
|   'VIEW',                                                                                                  |
|   '',                                                                                                      |
|   'INFORMATION_SCHEMA',                                                                                    |
|   'DATABASES'                                                                                              |
| )                                                                                                          |
|------------------------------------------------------------------------------------------------------------|
| DATABASE_NAME,DATABASE_OWNER,IS_TRANSIENT,COMMENT,CREATED,LAST_ALTERED,RETENTION_TIME,TYPE,OWNER_ROLE_TYPE |
+------------------------------------------------------------------------------------------------------------+

如果之前没有调用过 SYSTEM$SET_DEFAULT_COLUMNS_OVERRIDE_FOR_SYSTEM_OBJECT,或者如果调用了 SYSTEM$UNSET_DEFAULT_COLUMNS_OVERRIDE_FOR_SYSTEM_OBJECT,则该函数返回空字符串。

SELECT SYSTEM$UNSET_DEFAULT_COLUMNS_OVERRIDE_FOR_SYSTEM_OBJECT(
  'VIEW',
  'SNOWFLAKE',
  'ACCOUNT_USAGE',
  'DATABASES'
);

SELECT SYSTEM$GET_DEFAULT_COLUMNS_OVERRIDE_FOR_SYSTEM_OBJECT(
  'VIEW',
  'SNOWFLAKE',
  'ACCOUNT_USAGE',
  'DATABASES'
);
+--------------------------------------------------------+
| SYSTEM$GET_DEFAULT_COLUMNS_OVERRIDE_FOR_SYSTEM_OBJECT( |
|   'VIEW',                                              |
|   'SNOWFLAKE',                                         |
|   'ACCOUNT_USAGE',                                     |
|   'DATABASES'                                          |
| )                                                      |
|--------------------------------------------------------|
|                                                        |
+--------------------------------------------------------+

从之前针对 SHOW 命令和 Snowflake 视图的所有调用中获取列的列表

要获取针对所有 SHOW 命令和 Snowflake 视图所覆盖的列的列表,请调用 SYSTEM$GET_ALL_DEFAULT_COLUMNS_OVERRIDES 函数。例如:

SELECT SYSTEM$GET_ALL_DEFAULT_COLUMNS_OVERRIDES();

该函数返回一个包含 JSON 对象数组的字符串。每个对象表示特定 SHOW 命令或 Snowflake 视图的列的列表。例如:

+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| SYSTEM$GET_ALL_DEFAULT_COLUMNS_OVERRIDES()                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [{"domain":"VIEW","isShowCommand":false,"dbName":"","schemaName":"INFORMATION_SCHEMA","objectName":"DATABASES","serializedDefaultColumns":"DATABASE_NAME,DATABASE_OWNER,IS_TRANSIENT,COMMENT,CREATED,LAST_ALTERED,RETENTION_TIME,TYPE,OWNER_ROLE_TYPE"},{"domain":"VIEW","isShowCommand":false,"dbName":"SNOWFLAKE","schemaName":"ACCOUNT_USAGE","objectName":"DATABASES","serializedDefaultColumns":"DATABASE_ID,DATABASE_NAME,DATABASE_OWNER,IS_TRANSIENT,COMMENT,CREATED,LAST_ALTERED,DELETED,RETENTION_TIME,RESOURCE_GROUP,TYPE,OWNER_ROLE_TYPE,OBJECT_VISIBILITY"},{"isShowCommand":true,"showCommandType":"NOTIFICATION INTEGRATIONS","serializedDefaultColumns":"name,type,category,enabled,comment,created_on"}] |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

有关每个对象中的名/值对说明,请参阅 SYSTEM$GET_ALL_DEFAULT_COLUMNS_OVERRIDES

更新脚本和代码以防在引入新列时出现问题

为防止因引入新列而出现问题,脚本和代码应在查询 Snowflake 视图时从 SHOW 命令的输出中选择特定列。

要从 SHOW 命令的输出中选择特定列,您可以使用 管道运算符。请参见 为 SHOW 命令的输出选择列的列表 中的示例。