|iceberg-tm|のfixed[L]列への挿入時における正確な長さの強制(プレビュー)

注意

この動作変更は2026_02バンドルにあります。

バンドルの現在のステータスについては、 バンドル履歴 をご参照ください。

SnowflakeはIcebergの:code:`fixed[L]`列タイプへの挿入において、正確な長さを強制します。

変更前:

Icebergの:code:`fixed[L]`データ型を使用した列では、指定された長さ(Lバイト)までのバイナリデータを保存できます。Lより短い値は許可されています。

値がLを超える長さの場合、クエリが失敗します。

変更後:

Icebergの:code:`fixed[L]`データ型を使用する列は、定義された長さ(Lバイト)に正確に一致するバイナリ値を受け入れます。INSERTステートメントでLより短いバイナリ値を挿入しようとすると、エラーが発生します。

この変更により、SnowflakeはIceberg仕様およびApache Spark™などの他のIceberg互換エンジンと整合するようになります。

以下のリストは、この変更を有効にした後の動作をまとめたものです。

  • この変更は、新規および既存のIcebergテーブルの両方に適用されます。

  • この変更は、Snowflake管理および外部管理のIcebergテーブルの両方に適用されます。

  • 読み取りに関しては、この変更は古いスナップショットやTime Travelには影響しません。SnowflakeはDML操作中にIceberg :code:`fixed[L]`データ型の長さのみを検証するため、既存のスナップショットは引き続き読み取り可能です。

  • 書き込みについては、この変更を有効にすると、SnowflakeはTime Travel時を含め、書き込み操作中に常にIceberg :code:`fixed[L]`データ型の正しい長さを強制します。定義された長さ(Lバイト)と正確に一致しないバイナリ値を挿入しようとする書き込みは必ず失敗します。値がLよりも長い場合も、クエリは失敗します。

サービスの中断を回避するために必要なこと:影響を受ける列の特定と解決

影響を受ける列の特定と解決

このセクションでは、列がこのBCRの影響を受けるかどうかを識別し、影響を受ける列を解決する方法について説明します。

ステップ1:影響を受ける列を特定する

影響を受ける列があるかどうかを識別するには、以下のステップに従います。

  1. DESCRIBE ICEBERG TABLEコマンドを実行します。

    出力で、ソースIceberg型が:code:`fixed[L]`である列を探します。Iceberg型:code:`fixed[L]`の列が見つかった場合は、次のステップに進みます。

  2. 以下のクエリを実行します。

    SELECT BOOLOR_AGG(OCTET_LENGTH(<column_name>) != L) from <table_name>
    
    Copy

    クエリがtrueを返す場合、列には不正な長さの値が含まれているため、その列が影響が出ます。

ステップ2:影響を受ける列を解決する

影響を受ける列を解決するには、次のいずれかを実行します

影響を受ける列に、最大長までの任意のサイズのバイナリ値を挿入することを許可する

影響を受ける列を解決するには、影響を受ける列に、最大長までの任意のサイズのバイナリ値を挿入することを許可できます。

この解決策により、テーブルのメタデータと物理ファイルがIceberg仕様に準拠し、外部エンジンとの互換性が確保されます。

影響を受ける列に任意のサイズのバイナリ値を最大長まで挿入することを許可するには、次の手順に従います。

  • テーブルがSparkなどの外部エンジンからアクセスされる場合は、列タイプをBINARYにしてテーブルを再作成する必要があります。

    列タイプBINARYを使用してテーブルを再作成するには次のステップに従います。

    1. 影響を受ける列を含むテーブルに基づいて新しいテーブルを作成してデータを入力するには、CREATE ICEBERG TABLE … AS SELECT(CTASとも呼ばれる)コマンドを実行し、影響を受ける列のデータ型としてバイナリを指定します。

      次の例は、新しいテーブルの列bのデータ型がバイナリとして指定されているCTASステートメントを示しています。

      CREATE ICEBERG TABLE my_table (..., b binary) AS SELECT * FROM my_old_table
      
      Copy
    2. 影響を受ける列を含むテーブルを削除するには、DROP ICEBERG TABLEコマンドを使用します。

  • あるいは、ALTER ICEBERG TABLEコマンドを実行して列のデータ型をBINARYに設定することで、テーブルスキーマを変更することもできます。

    重要

    ALTER ICEBERG TABLEステートメントを実行して列のデータ型をBINARYに変更する前に、まず`Snowflakeサポート`_に連絡して、アカウントでこの機能を有効にする必要があります。

    例えば、次のステートメントは、列``c``のデータ型を``BINARY``に変更することで、テーブル``t``のスキーマを進化させます。

    ALTER ICEBERG TABLE t ALTER COLUMN c SET DATA TYPE BINARY;
    
    Copy

    このアプローチは、BCR期間中に影響を受けるお客様向けの、一時的なサポート対象ソリューションです。このアプローチの利点は、テーブル全体を再作成する代わりに、テーブルスキーマを更新するだけでよいことです。

    重要

    このアプローチは有効なIceberg型昇格ではないため、外部エンジンが無効な型昇格を検出し、テーブルのリフレッシュに失敗する可能性があります。したがって、このアプローチは、外部エンジンによる読み取りや書き込みが行われないSnowflake管理のIcebergテーブルでのみ使用してください。

影響を受ける列に、長さが正確にLである固定長バイナリ値を挿入することを許可する

影響を受ける列に長さLの固定長バイナリ値を挿入できるようにするには、トリミングやパディングなどのワークフロー調整を行い、入力する値のサイズがターゲットサイズと一致するようにします。また、以前にテーブルに挿入した値のサイズが、定義済みの長さLと完全に一致していることを確認するために、Icebergの列タイプ:code:`fixed(L)`を使用してIcebergテーブルを再作成することをお勧めします。

参照:2246