Forcer la longueur exacte pour les insertions dans les colonnes fixes[L] Apache Iceberg™ (Prévisualisation)¶
Attention
Ce changement de comportement est présent dans le bundle 2026_02.
Pour connaître le statut actuel du bundle, reportez-vous à Historique du bundle.
Snowflake forcera des insertions de longueur exacte dans les types de colonnes fixed[L] Iceberg.
- Avant la modification:
Les colonnes qui utilisent les types de données
fixed[L]Iceberg acceptent des valeurs binaires jusqu’à la longueur « L » définie en octets. Les valeurs plus courtes que L sont autorisées.Les valeurs plus longues que L entraînent l’échec de la requête.
- Après la modification:
Les colonnes qui utilisent les types de données
fixed[L]Iceberg acceptent des valeurs binaires correspondant exactement à la longueur « L » définie en octets. Les instructions INSERT qui tentent d’insérer une valeur binaire plus courte que L entraînent une erreur.Ce changement aligne Snowflake sur la spécification Iceberg et sur d’autres moteurs compatibles avec Iceberg, comme Apache Spark™.
La liste suivante résume le comportement après l’activation de cette modification :
Cette modification s’applique à la fois aux tables Iceberg nouvelles et existantes.
Cette modification s’applique à la fois aux tables Iceberg gérées par Snowflake et aux tables Iceberg gérées en externe.
En ce qui concerne les lectures, ce changement n’a aucun impact sur les anciens instantanés ou sur Time Travel. Les instantanés existants resteront lisibles, car Snowflake ne valide que la longueur du type de données
fixed[L]Iceberg lors des opérations DML.En ce qui concerne les écritures, avec ce changement activé, Snowflake appliquera toujours la longueur correcte du type de données
fixed[L]Iceberg pendant les opérations d’écriture, y compris pendant Time Travel. Les écritures qui tentent d’insérer une valeur binaire qui ne correspond pas exactement à la longueur définie en octets échouent toujours. Les valeurs plus longues que L entraînent toujours l’échec de la requête.
Ce que vous devez faire pour éviter toute interruption de service :Identifier et résoudre les colonnes impactées.
Identifier et résoudre les colonnes impactées¶
Cette section montre comment identifier si une colonne est impactée par ce BCR et comment résoudre les colonnes impactées.
Étape 1 : Identifier les colonnes impactées¶
Pour identifier si vous avez des colonnes impactées, suivez les étapes suivantes :
Exécutez la commande DESCRIBE ICEBERG TABLE.
Dans la sortie, recherchez les colonnes dont le type Iceberg source est
fixed[L]. Si vous trouvez une colonne de type Icebergfixed[L], passez à l’étape suivante.Exécutez la requête suivante :
SELECT BOOLOR_AGG(OCTET_LENGTH(<column_name>) != L) from <table_name>
Si la requête renvoie « true », la colonne contient des valeurs de longueur incorrecte, et la colonne est donc impactée.
Étape 2 : Résoudre les colonnes impactées¶
Pour résoudre les colonnes impactées, effectuez l’une des opérations suivantes :
Autoriser l’insertion de valeurs binaires de taille arbitraire dans la colonne impactée, jusqu’à une longueur maximale¶
Pour résoudre les colonnes impactées, vous pouvez autoriser l’insertion de valeurs binaires de taille arbitraire dans la colonne impactée, jusqu’à une longueur maximale.
Cette résolution garantit que les métadonnées et les fichiers physiques de la table sont alignés sur la spécification Iceberg et sont donc compatibles avec les moteurs externes.
Pour permettre l’insertion de valeurs binaires de taille arbitraire dans la colonne impactée, jusqu’à une longueur maximale, suivez ces instructions :
Si votre table est accessible à des moteurs externes tels que Spark, vous devez recréer la table en utilisant le type de colonne BINARY.
Pour recréer la table en utilisant le type de colonne BINARY, suivez les étapes suivantes :
Pour créer et remplir une nouvelle table basée sur la table avec les colonnes impactées, exécutez la commande CREATE ICEBERG TABLE … AS SELECT (également appelé CTAS) et spécifiez binaire comme type de données pour les colonnes impactées.
L’exemple suivant montre une instruction CTAS où le type de données de la colonne b de la nouvelle table est spécifié comme binaire :
CREATE ICEBERG TABLE my_table (..., b binary) AS SELECT * FROM my_old_table
Utilisez la commande DROP ICEBERG TABLE pour supprimer la table dont les colonnes ont été impactées.
Vous pouvez également faire évoluer le schéma de table en exécutant la commande ALTER ICEBERG TABLE pour définir le type de données de la colonne sur BINARY.
Important
Avant d’exécuter une instruction ALTER ICEBERG TABLE pour modifier le type de données d’une colonne en BINARY, vous devez d’abord contacter le Support Snowflake pour activer cette fonctionnalité pour votre compte.
Par exemple, l’instruction suivante fait évoluer le schéma de la table
ten modifiant le type de données de la colonnecdans``BINARY`` :ALTER ICEBERG TABLE t ALTER COLUMN c SET DATA TYPE BINARY;
Cette approche est une solution temporaire prise en charge pour les clients concernés pendant la période BCR. L’avantage de cette approche est que vous ne devez mettre à jour que le schéma de la table au lieu de recréer la table entière.
Important
Cette approche n’est pas une promotion de type Iceberg valide, de sorte que les moteurs externes peuvent détecter une promotion de type non valide et ne pas réussir à actualiser la table. Par conséquent, vous ne devez utiliser cette approche qu’avec des tables Iceberg gérées par Snowflake qui ne sont pas lues par des moteurs externes ou écrites dans des moteurs externes.
Autoriser l’insertion de valeurs binaires de longueur fixe de longueur L exacte dans la colonne impactée¶
Pour permettre l’insertion de valeurs binaires de longueur fixe de longueur L exacte dans la colonne impactée, assurez-vous que la taille de la valeur que vous entrez correspond à la taille cible en ajustant votre flux de travail, par exemple en utilisant le découpage ou le remplissage. Nous vous recommandons également de recréer la table Iceberg avec le type de colonne fixed(L) Iceberg pour vous assurer que la taille de toutes les valeurs que vous avez précédemment insérées dans la table correspond exactement à la longueur L définie.
Réf : 2246