ALTER ICEBERG TABLE ... ALTER COLUMN ... SET DATA TYPE(構造化された型)¶
注釈
この構文は、外部カタログを使用するIcebergテーブルではサポートされていません。
Snowflakeで管理される Apache Iceberg™テーブル の 構造化型 列を変更(進化)します。
このコマンドを使用すると、Icebergテーブル列の構造化型を変更できます。構造化された OBJECT のキーの名前を変更するか、以下の変更を組み合わせて実行することができます。
- 構造化型内のフィールドの型を進化させます。 
- 構造化された OBJECT におけるキーの並べ替え。 
- 構造化された OBJECT へのキーの追加。 
- 構造化された OBJECT からのキーのドロップ。 
キーの名前変更と他の変更を組み合わせることはできません。
Icebergテーブルと通常のSnowflakeテーブルを区別する場合を除き、このトピックでは簡潔にするため、Icebergテーブルを単に「テーブル」と呼びます。
構文¶
構造型列を変更する
ALTER ICEBERG TABLE [ IF EXISTS ] <table_name> ALTER COLUMN <structured_column>
  SET DATA TYPE <new_structured_type>
構造化された OBJECT のキーの名前を変更する
ALTER ICEBERG TABLE [ IF EXISTS ] <table_name> ALTER COLUMN <structured_column>
  SET DATA TYPE <new_structured_type>
  RENAME FIELDS
パラメーター¶
- table_name
- 変更するテーブルの識別子。 - 識別子にスペースまたは特殊文字が含まれる場合は、文字列全体を二重引用符で囲む必要があります。二重引用符で囲まれた識別子も大文字と小文字が区別されます。 - 詳細については、 識別子の要件 をご参照ください。 
- ALTER COLUMN structured_column
- 変更する構造化型列を指定します。 - 識別子にスペースまたは特殊文字が含まれる場合は、文字列全体を二重引用符で囲む必要があります。二重引用符で囲まれた識別子も大文字と小文字が区別されます。 - 詳細については、 識別子の要件 をご参照ください。 
- SET DATA TYPE new_structured_type
- 列に使用する新しい構造化型の包括的な仕様。たとえば、 NUMBER 要素の構造化された ARRAY を指定するには、 ARRAY(NUMBER)を使用します。 - 詳細については、 構造化型の指定 とこのページの例をご参照ください。 
- RENAME FIELDS
- 構造化された OBJECT 内にある1つ以上のキーの名前を変更するように指定します。新旧のキーは名前のみが異なり、階層とデータ型はまったく同じにする必要があります。キーの名前を変更しても、フィールド IDs は変更されません。 - キーの名前変更をIcebergテーブルの構造化型に対する他の変更と組み合わせることはできません。 - RENAME FIELDS の例 をご参照ください。 
アクセス制御の要件¶
この操作の実行に使用される ロール には、少なくとも次の 権限 が必要です。
| 権限 | オブジェクト | メモ | 
|---|---|---|
| OWNERSHIP | Icebergテーブル | OWNERSHIP is a special privilege on an object that is automatically granted to the role that created the object, but can also be transferred using the GRANT OWNERSHIP command to a different role by the owning role (or any role with the MANAGE GRANTS privilege). | 
| USAGE | 外部ボリューム | 
スキーマ内のオブジェクトに対して操作を実行するには、親データベースとスキーマに対する USAGE 権限が必要です。スキーマに対する 任意の権限を付与されたロールは、そのロールがスキーマを解決できることに注意してください。たとえば、スキーマに対するCREATE権限を付与されたロールは、そのスキーマにオブジェクトを作成できますが、そのスキーマに対するUSAGE*も*付与されている必要はありません。
指定された権限のセットを使用してカスタムロールを作成する手順については、 カスタムロールの作成 をご参照ください。
セキュリティ保護可能なオブジェクト に対して SQL アクションを実行するためのロールと権限付与に関する一般的な情報については、 アクセス制御の概要 をご参照ください。
使用上の注意¶
- このコマンドは以下のアクションをサポートしていません。 - 構造化型を非構造化型に進化(またはその逆)。 
- 構造化された ARRAY 要素または構造化された MAP のキーと値のペアにnull制約を設定。 
- RENAME FIELDS を使用して、テーブルのクラスタリングキーの一部であるキーの名前を変更。 
- 構造化された OBJECT に対する NULL 制約を変更。 
- カタログリンクデータベースのテーブルを変更。 
 
- データアクセスポリシーを使用するテーブルでは、列の新しいデータ型がデータアクセスポリシーの引数型と互換性があることを確認してください。互換性がないと、テーブルへのクエリに失敗する可能性があります。たとえば、構造化された OBJECT 列にキーを追加する場合、ポリシーを変更するか、新しいポリシーを作成してテーブルに適用する必要があります。 
- メタデータについて: - 注意 - Snowflakeサービスを使用する場合、お客様は、個人データ(ユーザーオブジェクト向け以外)、機密データ、輸出管理データ、またはその他の規制されたデータがメタデータとして入力されていないことを確認する必要があります。詳細については、 Snowflakeのメタデータフィールド をご参照ください。 
例¶
型の進化¶
構造化型のフィールドの型を進化させることができます。この型を進化させるとは、より大きな、関連するIcebergデータ型に広げるということです。
Snowflakeは、 Apache Iceberg仕様: に従って、以下の型進化をサポートしています。
- int型のフィールドを- long型に変更。
- float型のフィールドを- double型に変更。
- pが- p'より小さい場合は、- decimal(p,s)型のフィールドを- decimal(p',s)型に変更。
フィールド型を進化させるには、 構造化型を指定するためのSnowflake 構文 を使用します。Icebergデータ型は仕様で使用できます。たとえば、次のステートメントは、構造化された ARRAY 列の要素型を(Iceberg)型 long に変更します。
ALTER ICEBERG TABLE my_iceberg_table ALTER COLUMN col1
  SET DATA TYPE ARRAY(long);
Icebergデータ型とSnowflakeデータ型のマッピングについては、 Apache Iceberg™ テーブルのデータ型 をご参照ください。
キーの並べ替え¶
構造化された OBJECT のキーの順序を並べ替えるには、 ALTER ICEBERG TABLE ステートメントで新しい順序を指定します。キーの順番を入れ替えても、 OBJECT のデータには影響しません。
たとえば、次の CREATE ICEBERG TABLE ステートメントを考えます。このテーブルには、指定された順序で並んでいる2つのキーがある OBJECT 型の列(column_1)が1つあります。
CREATE ICEBERG TABLE my_iceberg_table (
  column_1 OBJECT(
      key_a int,
      key_b int
    )
  )
  CATALOG = 'SNOWFLAKE'
  EXTERNAL_VOLUME = 'my_external_volume'
  BASE_LOCATION = '';
次のコマンドは、 key_b が key_a の前に来るようにキーの順序を変更します。
ALTER ICEBERG TABLE my_iceberg_table ALTER COLUMN column_1
  SET DATA TYPE OBJECT(
    key_b int,
    key_a int
  );
キーの追加¶
構造化された OBJECT にキーを追加できます。新しいキーの値には、 Icebergテーブルでサポートされている任意のデータ型 を使用できます。
注釈
キーを追加する際は、null制約を設定できません。Snowflakeはテーブル内にあるすべての既存の行に対してキーの値を NULL に設定するためです。
たとえば、次の CREATE ICEBERG TABLE ステートメントを考えます。テーブルには、1つのキー(key_1)がある OBJECT 型の列(column_1)が1つあります。
CREATE ICEBERG TABLE my_iceberg_table (
  column_1 OBJECT(
      key_1 int
    )
  )
  CATALOG = 'SNOWFLAKE'
  EXTERNAL_VOLUME = 'my_external_volume'
  BASE_LOCATION = '';
次のコマンドは、 key_2 という名前のキーを column_1 に追加します。
ALTER ICEBERG TABLE my_iceberg_table ALTER COLUMN column_1
  SET DATA TYPE OBJECT(
    key_1 int,
    key_2 int
  );
キーのドロップ¶
注釈
値がクラスタリングキーに属する構造化されたデータ型のキーのドロップはサポートされていません。
構造化された OBJECT からキーをドロップするには、 ALTER ICEBERG TABLE ... ALTER COLUMN コマンドを使用して、 OBJECT を再定義します。
キーをドロップすると、テーブルのすべての行からキーとその値が削除されます。
たとえば、次の CREATE ICEBERG TABLE ステートメントを考えます。このテーブルには、2つのキーがある OBJECT 型の列(column_1)が1つあります。
CREATE ICEBERG TABLE my_iceberg_table (
  column_1 OBJECT(
      key_1 int,
      key_2 ARRAY(string)
    )
  )
  CATALOG = 'SNOWFLAKE'
  EXTERNAL_VOLUME = 'my_external_volume'
  BASE_LOCATION = '';
次のコマンドは、 OBJECT の仕様から key_2 という名前のキーを省略することで、キーをドロップします。
ALTER ICEBERG TABLE my_iceberg_table ALTER COLUMN column_1
  SET DATA TYPE OBJECT(
    key_1 int
  );
キーの名前変更¶
構造化された OBJECT のキーの名前を変更するには、 RENAME FIELDS キーワードを使用します。
たとえば、次の CREATE ICEBERG TABLE ステートメントを考えます。
CREATE ICEBERG TABLE my_iceberg_table (
  column_1 OBJECT(
      key_1 int,
      key_2 int
    )
  )
  CATALOG = 'SNOWFLAKE'
  EXTERNAL_VOLUME = 'my_external_volume'
  BASE_LOCATION = '';
次のコマンドは、 RENAME FIELDS を使用して、 column_1 のキーの名前を変更します。
ALTER ICEBERG TABLE my_iceberg_table ALTER COLUMN column_1
  SET DATA TYPE OBJECT(
    k_1 int,
    k_2 int
  )
  RENAME FIELDS;