2022_01 捆绑包

本主题介绍当月的以下行为变更(如果有):

  • 已弃用的功能。

  • 已启用的捆绑包变更。

  • 已实现的其他非捆绑包变更。

如果您对这些变更有任何疑问,请联系 Snowflake 支持部门 (https://community.snowflake.com/s/article/How-To-Submit-a-Support-Case-in-Snowflake-Lodge)。

有关本月推出的新功能、增强功能和修复的详细信息,请参阅 2022 年 3 月

重要

除非另有说明,否则这些变更位于在 6.7 行为变更版本中默认启用的 2022_01 捆绑包中

本主题内容:

SQL 变更 – 常规

事务:提交中止的事务将返回错误消息

进行此变更后,尝试提交已中止的事务将返回错误消息:

之前:

如果您在中止的事务中执行了 COMMIT 语句(例如,通过单独的 SYSTEM$ABORT_TRANSACTION 调用或因为会话处于空闲状态),则该语句似乎会成功,并显示以下消息:

Statement executed successfully.

但是,事务本身已经中止。

COMMIT 语句的输出消息错误地暗示事务成功。

现在:

如果在已中止的事务中执行 COMMIT 语句(例如,通过单独的 SYSTEM$ABORT_TRANSACTION 调用或因为会话处于空闲状态),则该语句将失败,并显示错误代码 000670 和以下消息:

000670 (57014): COMMIT failed. Your transaction '<name>', id '<id>', was already aborted.

SQL 变更 – 命令和函数

SHOW TAGS:输出中的新列

以下列已添加到 SHOW TAGS 命令的输出中:

  • allowed_values:此新列指定在为对象分配标签时可以设置的字符串值。如果标签没有任何指定的 allowed_values,则列值为 NULL。

为了帮助限制此变更的影响,新列已添加至输出的最后。

SHOW USERS:为分页结果、有限结果和简洁输出添加支持

SHOW USERS 命令的行为已变更如下:

之前:

SHOW USERS 命令将 SQL 输出限制为 10,000 行,并且仅支持以下语法:

SHOW USERS [ LIKE '<pattern>' ]
Copy
现在:

SHOW USERS 命令可用于返回超过 10,000 行的输出,并支持以下语法:

SHOW [ TERSE ] USERS [ LIKE '<pattern>' ] [ STARTS WITH '<name_string>' ] [ LIMIT <rows> [ FROM '<name_string>' ] ]
Copy

其中:

  • TERSE (可选)仅返回输出列的以下子集:

    name, created_on, display_name, first_name, last_name, email, org_identity, comment, has_password, has_rsa_public_key.

    默认:无值(所有列都包含在输出中)。

  • STARTS WITH 'name_string' (可选)根据对象名称开头显示的字符筛选命令输出。该字符串必须放在单引号中并且区分大小写。例如,以下子句会返回不同的结果:

    ... STARTS WITH 'B' ...

    ... STARTS WITH 'b' ...

    默认:无值(不对输出应用筛选)。

  • LIMIT rows [ FROM 'name_string' ] (可选)限制返回的最大行数,同时还对结果启用“分页”功能。注意,实际返回的行数可能小于指定的限制(例如,现有对象的数量小于指定的限制)。

    可选的 FROM 'name_string' 分子句实际上会充当结果的“游标”。这样就可以提取对象名称与指定字符串匹配的第一行之后的指定行数:

    该字符串必须放在单引号中并且区分大小写。此外,该字符串不必包含完整的对象名称;支持部分名称。

    默认:无值(不对输出应用限制)。

默认情况下, SHOW USERS 仍然像以前一样返回 10,000 行输出。如果您的账户用户数超过 10,000 人,您可以运行该命令两次,以返回超过 10,000 人限制的用户:

SHOW USERS;

SHOW USERS LIMIT 10000 FROM 'JOE';
Copy
  • 第一个语句返回前 10,000 个用户。返回的最后一行是用户名为 JOE 的用户。

  • 第二条语句返回 JOE 之后的 10,000 个用户。

SYSTEM$EXTERNAL_TABLE_PIPE_STATUS 和 SYSTEM$PIPE_STATUS 函数: JSON 输出中的其他详细信息

SYSTEM$EXTERNAL_TABLE_PIPE_STATUSSYSTEM$PIPE_STATUS 函数的 JSON 输出现在包括以下额外字符串名称/值对,以改进对特定数据加载的见解,包括加载期间遇到的错误:

名称

描述

备注

oldestPendingFilePath

当前排队等待处理的最早数据文件的路径。将文件添加到队列时的时间戳将在现有 oldestFileTimestamp 属性中返回。

lastIngestedTimestamp

Snowpipe 将最新文件成功加载到目标表中的时间戳。

仅 SYSTEM$PIPE_STATUS。

lastIngestedFilePath

在 lastIngestedTimestamp 中指定的时间戳处加载的文件的路径。

仅 SYSTEM$PIPE_STATUS。

lastPipeErrorTimestamp

最近一次在管道定义中编译 COPY INTO 语句以执行时产生错误的时间戳。

仅 SYSTEM$PIPE_STATUS。

lastPipeFaultTimestamp

最近一次检测到内部 Snowflake 处理错误的时间戳。

lastPulledFromChannelTimestamp

Snowpipe 最近一次从 Amazon Simple Queue Service (SQS) 队列、Google Pub/Sub 队列或 Microsoft Azure 存储队列中提取管道的“创建对象”事件通知的时间戳。

lastForwardedFilePath

转发到管道的最近一条“创建对象”事件消息中识别到的数据文件的路径。

以下示例展示了 Snowpipe 遇到的常见问题的示例输出。函数输出中的其他详细信息可帮助您诊断数据加载中出现的这些问题和其他问题:

  • 通知队列配置不正确:

    {"executionState":"RUNNING","pendingFileCount":0,"notificationChannelName":"projects/myproject/subscriptions/mysubscription","numOutstandingMessagesOnChannel":0,"lastPulledFromChannelTimestamp:"2022-01-20T06:24:44.771Z"}
    
    Copy

    Snowpipe 尝试从 Amazon Simple Queue Service (SQS) 队列、Google Pub/Sub 队列或 Microsoft Azure 存储队列中定期提取管道的“创建对象”事件通知。缺少或过时的 lastPulledFromChannelTimestamp 值表示 Snowpipe 无法连接到存储队列。

    如果 lastPulledFromChannelTimestamp 时间戳是最近的,但 numOutstandingMessagesOnChannel0,则 Snowpipe 可以接收来自队列的事件通知,但没有通知排队。如果未在存储位置创建任何数据文件,或者队列订阅配置错误,则可能会出现最后一个问题。

  • 通知队列权限问题:

    {"executionState":"RUNNING","pendingFileCount":0,"lastIngestedTimestamp":"2022-01-20T04:30:02.518Z","lastIngestedFilePath":"myfile.csv","notificationChannelName":"projects/myproject/subscriptions/mysubscription","numOutstandingMessagesOnChannel":1,"lastReceivedMessageTimestamp":"2022-01-20T04:30:02.319Z","lastForwardedMessageTimestamp":"2022-01-20T04:30:03.27Z","channelErrorMessage":"no monitoring permission: numOutstandingMessagesOnChannel is not accurate","lastErrorRecordTimestamp":"2022-01-20T04:44:08.461Z","lastPulledFromChannelTimestamp":"2022-01-20T04:44:08.461Z","lastForwardedFilePath":"mypath/myfile.csv"}
    
    Copy

    channelErrorMessage 值表示 Snowflake 未获得足够的权限以访问存储队列并拉取事件通知。

  • 管道定义和事件通知配置中指定的路径不匹配:

    {"executionState":"RUNNING","pendingFileCount":0,"lastIngestedTimestamp":"2022-01-20T06:00:01.669Z","lastIngestedFilePath":"myfile.csv","notificationChannelName":"projects/myproject/subscriptions/mysubscription","numOutstandingMessagesOnChannel":1,"lastReceivedMessageTimestamp":"2022-01-20T06:04:01.089Z","lastForwardedMessageTimestamp":"2022-01-20T06:00:02.741Z","lastPulledFromChannelTimestamp":"2022-01-20T06:05:28.49Z","lastForwardedFilePath":"mypath/myfile.csv"}
    
    Copy

    lastForwardedMessageTimestamp 时间戳早于 lastReceivedMessageTimestamp。这种情况表示 Snowpipe 从存储队列中提取了至少一条“创建对象”事件消息,但该消息与管道中定义的路径不匹配,因此未转发到管道进行处理。

  • 外部存储位置权限问题:

    {"executionState":"STALLED_STAGE_PERMISSION_ERROR","pendingFileCount":0,"error":"Failed to access the stage, please check storage permission.", "lastPipeErrorTimestamp":"2022-01-20T04:40:01.747Z", "lastIngestedTimestamp":"2022-01-20T04:30:02.518Z","lastIngestedFilePath":"myfile.csv","notificationChannelName":"projects/myproject/subscriptions/mysubscription","numOutstandingMessagesOnChannel":1,"lastReceivedMessageTimestamp":"2022-01-20T04:30:02.319Z","lastForwardedMessageTimestamp":"2022-01-20T04:30:03.27Z","channelErrorMessage":"no monitoring permission: numOutstandingMessagesOnChannel is not accurate","lastErrorRecordTimestamp":"2022-01-20T04:44:08.461Z","lastPulledFromChannelTimestamp":"2022-01-20T04:39:58.494Z","lastForwardedFilePath":"mypath/myfile.csv"}
    
    Copy

    executionState 值和错误消息表示 Snowflake 未被授予访问存储位置(即 Amazon S3 或 Google Cloud Storage 桶或 Microsoft Azure 容器)中数据文件的存储位置的最低权限。

  • 在管道定义中编译 COPY INTO <table> 语句时出错:

    {"executionState":"STALLED_COMPILATION_ERROR","pendingFileCount":0,"error":"SQL compilation error: error line 1 at position 29\ninvalid identifier 'LAST_NAME'",", "lastPipeErrorTimestamp":"2022-01-20T17:54:30.4Z", "lastIngestedTimestamp":"2022-01-20T17:51:04.73Z","lastIngestedFilePath":"myfile.csv","notificationChannelName":"projects/myproject/subscriptions/mysubscription","numOutstandingMessagesOnChannel":1,"lastReceivedMessageTimestamp":"2022-01-20T17:51:03.336Z","lastForwardedMessageTimestamp":"2022-01-20T17:51:05.081Z","lastPulledFromChannelTimestamp":"2022-01-20T18:03:00.637Z","lastForwardedFilePath":"mypath/myfile.csv"}
    
    Copy

    executionState 值和错误消息表示 Snowpipe 无法执行管道定义中的 COPY INTO <table> 语句以加载从存储位置检索到的数据文件。

SQL 变更 – 使用情况视图和 Information Schema

FUNCTIONS 视图:新列

以下列已添加到 ACCOUNT_USAGE.FUNCTIONS 视图中,使其与 INFORMATION_SCHEMA.FUNCTIONS 视图一致:

  • handler

  • imports

  • target_path

为了帮助限制此变更的影响,新列已添加至视图的最后。

FUNCTIONS 视图、DESCRIBE FUNCTION 和 GET_DDL 函数:新列

以下列已添加到 INFORMATION_SCHEMA.FUNCTIONS 视图,以及 DESCRIBE FUNCTION 命令和 GET_DDL 函数的输出中:

  • request_translator:请求转换器 JavaScript 的用户定义函数名称(如果存在)。

  • response_translator:响应转换器 JavaScript 的用户定义函数名称(如果存在)。

​​​​​请求转换器和响应转换器允许您变更经由外部函数使用的远程服务发送和接收的数据格式。有关更多信息,请参阅 将请求和响应转换器与远程服务的数据结合使用

POLICY_REFERENCES 函数:新列

created_on 列已从 INFORMATION_SCHEMA.POLICY_REFERENCES 表函数的输出中移除。

以下列已添加到 INFORMATION_SCHEMA.POLICY_REFERENCES 表函数的输出中:

  • tag_name

  • tag_database

  • tag_schema

  • policy_status

这些新列可用于按标签名称发现列的策略关联。

为了帮助限制此变更的影响,这些新列已添加至输出的最后。

TAGS 视图:新列

以下列已添加到 ACCOUNT_USAGE.TAGS 视图中:

  • allowed_values:指定将标签分配给对象时可以设置的字符串值。如果标签没有任何指定的 allowed_values,则列值为 NULL。

为了帮助限制此变更的影响,新列已添加至视图的最后。

TASK_HISTORY 函数:默认返回前 7 天的任务使用情况历史记录

INFORMATION_SCHEMA.TASK_HISTORY 表格函数的行为已变更如下:

之前:

默认情况下,该函数返回在未确定开始日期或时间的时间范围内运行的历史任务的记录。由于内部数据清理活动,时间范围通常限制为前 14 天;然而,在极少数情况下,该期限可能会往前进一步延长。

如果在查询中指定了 SCHEDULED_TIME_RANGE_START 实参,则时间范围仅限于前 7 天或更短时间的历史记录。

现在:

该函数返回过去 7 天内开始的历史任务运行的记录。

请注意,与前面的行为一样,如果在查询中指定了 SCHEDULED_TIME_RANGE_START 实参,则历史记录的时间范围将继续限制为前 7 天或更短时间。

TASK_HISTORY 视图/函数:新列

以下列已添加到 ACCOUNT_USAGE.TASK_HISTORY 视图和 INFORMATION_SCHEMA.TASK_HISTORY 表函数的输出中:

  • scheduled_from:指定提示任务运行的机制。列中返回的唯一值是 SCHEDULE。该值表示任务运行是由任务定义中的计划启动的。对于任务树中子任务的运行,该列还返回 SCHEDULE

引入该列是为了支持未来的功能。

仓库视图:仓库名称的一致输出

仓库的所有者(即对仓库具有 OWNERSHIP 权限的角色)或更高级别的角色可以使用新的 Web 界面或 ALTER WAREHOUSE ...RENAME 命令来重命名仓库。

重命名仓库时的行为已变更,如下所示:

之前:

显示在以下视图列中的仓库名称不一致:

  • ACCOUNT_USAGE、READER_ACCOUNT_USAGE 和 ORGANIZATION_USAGE

    • WAREHOUSE_METERING_HISTORY.WAREHOUSE_HAME

  • ACCOUNT_USAGE

    • METERING_HISTORY.NAME

视图中最近的记录(仓库名称变更前 2 到 3 小时)显示新名称;但是,较旧的记录仍显示旧名称。

现在:

这些视图中的 WAREHOUSE_NAME 和 NAME 列显示所有记录的新仓库名称。

备注

此行为变更不会影响以下视图和表函数,这些视图和表函数已显示 WAREHOUSE_NAME 列中所有记录的新仓库名称:

  • ACCOUNT_USAGE

    • WAREHOUSE_EVENTS_HISTORY 视图

    • WAREHOUSE_LOAD_HISTORY 视图

  • INFORMATION_SCHEMA

    • WAREHOUSE_LOAD_HISTORY 表函数

    • WAREHOUSE_METERING_HISTORY 表函数

可扩展性变更

JavaScript 存储过程:对错误处理的变更

JavaScript 中写入的存储过程的错误处理已变更如下:

之前:

JavaScript 存储过程引发的所有错误都具有相同的错误代码和 SQLSTATE``(分别为 ``100183P0000 )以及相同的通用错误消息 ("Execution error in stored procedure SP_NAME...")。

用于访问堆栈跟踪的属性的名称为 stackTraceTxt

例如,如果数据库对象不存在,则异常对象包含以下内容:

{
  "stackTraceTxt":"At Statement.execute, line 12 position 19",
  "state":"P0000",
  "code":100183,
  "message":"SQL compilation error:\nObject 'X' does not exist or not authorized."
}
Copy

如果存储过程未捕获异常,则调用存储过程将生成以下输出:

100183 (P0000): Execution error in store procedure ...:
SQL compilation error:
Object 'X' does not exist or not authorized.
At Statement.execute, line 12 position 19
Copy
现在:

如果存储过程执行任何查询(与大多数存储过程一样),并且在执行子查询时发生错误,则使用错误代码和子查询的 SQLSTATE

此外,用于访问堆栈跟踪的属性的名称已变更为 stack。尽管启用了行为变更后 stackTraceTxt 属性仍然存在,但在将来的版本中将移除 stackTraceTxt

例如,如果数据库对象不存在,则异常对象包含以下内容:

{
  "stack":"Statement.execute, line 12 position 19",
  "stackTraceTxt":"Statement.execute, line 12 position 19", // To be removed in a future release
  "state":"42S02",
  "code":2003,
  "message":"SQL compilation error:\nObject 'X' does not exist or not authorized."
}
Copy

如果存储过程未捕获异常,则调用存储过程将生成以下输出:

002003 (42S02): Execution error in store procedure ...:
SQL compilation error:
Object 'X' does not exist or not authorized.
At Statement.execute, line 12 position 19
Copy
语言: 中文