ALTER TABLE¶
Modifie les propriétés, les colonnes ou les contraintes d’une table existante.
- Voir aussi :
ALTER TABLE … ALTER COLUMN , CREATE TABLE , DROP TABLE , SHOW TABLES , DESCRIBE TABLE
Syntaxe¶
ALTER TABLE [ IF EXISTS ] <name> RENAME TO <new_table_name>
ALTER TABLE [ IF EXISTS ] <name> SWAP WITH <target_table_name>
ALTER TABLE [ IF EXISTS ] <name> { clusteringAction | tableColumnAction | constraintAction }
ALTER TABLE [ IF EXISTS ] <name> dataMetricFunctionAction
ALTER TABLE [ IF EXISTS ] <name> dataGovnPolicyTagAction
ALTER TABLE [ IF EXISTS ] <name> extTableColumnAction
ALTER TABLE [ IF EXISTS ] <name> searchOptimizationAction
ALTER TABLE [ IF EXISTS ] <name> SET
[ DATA_RETENTION_TIME_IN_DAYS = <integer> ]
[ MAX_DATA_EXTENSION_TIME_IN_DAYS = <integer> ]
[ CHANGE_TRACKING = { TRUE | FALSE } ]
[ DEFAULT_DDL_COLLATION = '<collation_specification>' ]
[ ENABLE_SCHEMA_EVOLUTION = { TRUE | FALSE } ]
[ COMMENT = '<string_literal>' ]
ALTER TABLE [ IF EXISTS ] <name> UNSET {
DATA_RETENTION_TIME_IN_DAYS |
MAX_DATA_EXTENSION_TIME_IN_DAYS |
CHANGE_TRACKING |
DEFAULT_DDL_COLLATION |
ENABLE_SCHEMA_EVOLUTION |
COMMENT |
}
[ , ... ]
Où :
clusteringAction ::= { CLUSTER BY ( <expr> [ , <expr> , ... ] ) /* RECLUSTER is deprecated */ | RECLUSTER [ MAX_SIZE = <budget_in_bytes> ] [ WHERE <condition> ] /* { SUSPEND | RESUME } RECLUSTER is valid action */ | { SUSPEND | RESUME } RECLUSTER | DROP CLUSTERING KEY }tableColumnAction ::= { ADD [ COLUMN ] [ IF NOT EXISTS ] <col_name> <col_type> [ { DEFAULT <default_value> | { AUTOINCREMENT | IDENTITY } /* AUTOINCREMENT (or IDENTITY) is supported only for */ /* columns with numeric data types (NUMBER, INT, FLOAT, etc.). */ /* Also, if the table is not empty (i.e. if the table contains */ /* any rows), only DEFAULT can be altered. */ [ { ( <start_num> , <step_num> ) | START <num> INCREMENT <num> } ] [ { ORDER | NOORDER } ] } ] [ inlineConstraint ] [ COLLATE '<collation_specification>' ] | RENAME COLUMN <col_name> TO <new_col_name> | ALTER | MODIFY [ ( ] [ COLUMN ] <col1_name> DROP DEFAULT , [ COLUMN ] <col1_name> SET DEFAULT <seq_name>.NEXTVAL , [ COLUMN ] <col1_name> { [ SET ] NOT NULL | DROP NOT NULL } , [ COLUMN ] <col1_name> [ [ SET DATA ] TYPE ] <type> , [ COLUMN ] <col1_name> COMMENT '<string>' , [ COLUMN ] <col1_name> UNSET COMMENT [ , [ COLUMN ] <col2_name> ... ] [ , ... ] [ ) ] | DROP [ COLUMN ] [ IF EXISTS ] <col1_name> [, <col2_name> ... ] } inlineConstraint ::= [ NOT NULL ] [ CONSTRAINT <constraint_name> ] { UNIQUE | PRIMARY KEY | { [ FOREIGN KEY ] REFERENCES <ref_table_name> [ ( <ref_col_name> ) ] } } [ <constraint_properties> ]Pour une syntaxe détaillée et des exemples pour modifier des colonnes, voir ALTER TABLE … ALTER COLUMN. .
Pour une syntaxe détaillée et des exemples de création/modification de contraintes en ligne, voir CREATE | ALTER TABLE … CONSTRAINT.
dataMetricFunctionAction ::= SET DATA_METRIC_SCHEDULE = { '<num> MINUTE' | 'USING CRON <expr> <time_zone>' | 'TRIGGER_ON_CHANGES' } | UNSET DATA_METRIC_SCHEDULE | { ADD | DROP } DATA METRIC FUNCTION <metric_name> ON ( <col_name> [ , ... ] ) [ , <metric_name_2> ON ( <col_name> [ , ... ] ) ] | MODIFY DATA METRIC FUNCTION <metric_name> ON ( <col_name> [ , ... ] ) { SUSPEND | RESUME } [ , <metric_name_2> ON ( <col_name> [ , ... ] ) { SUSPEND | RESUME } ]dataGovnPolicyTagAction ::= { SET TAG <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' ... ] | UNSET TAG <tag_name> [ , <tag_name> ... ] } | { ADD ROW ACCESS POLICY <policy_name> ON ( <col_name> [ , ... ] ) | DROP ROW ACCESS POLICY <policy_name> | DROP ROW ACCESS POLICY <policy_name> , ADD ROW ACCESS POLICY <policy_name> ON ( <col_name> [ , ... ] ) | DROP ALL ROW ACCESS POLICIES } | { SET AGGREGATION POLICY <policy_name> [ ENTITY KEY ( <col_name> [, ... ] ) ] [ FORCE ] | UNSET AGGREGATION POLICY } | ADD [ COLUMN ] [ IF NOT EXISTS ] <col_name> <col_type> [ [ WITH ] MASKING POLICY <policy_name> [ USING ( <col1_name> , <cond_col_1> , ... ) ] ] [ [ WITH ] PROJECTION POLICY <policy_name> ] [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ] | { { ALTER | MODIFY } [ COLUMN ] <col1_name> SET MASKING POLICY <policy_name> [ USING ( <col1_name> , <cond_col_1> , ... ) ] [ FORCE ] | UNSET MASKING POLICY } | { { ALTER | MODIFY } [ COLUMN ] <col1_name> SET PROJECTION POLICY <policy_name> [ FORCE ] | UNSET PROJECTION POLICY } | { ALTER | MODIFY } [ COLUMN ] <col1_name> SET TAG <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' ... ] , [ COLUMN ] <col2_name> SET TAG <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' ... ] | { ALTER | MODIFY } [ COLUMN ] <col1_name> UNSET TAG <tag_name> [ , <tag_name> ... ] , [ COLUMN ] <col2_name> UNSET TAG <tag_name> [ , <tag_name> ... ]extTableColumnAction ::= { ADD [ COLUMN ] [ IF NOT EXISTS ] <col_name> <col_type> AS ( <expr> ) | RENAME COLUMN <col_name> TO <new_col_name> | DROP [ COLUMN ] [ IF EXISTS ] <col1_name> [, <col2_name> ... ] }constraintAction ::= { ADD outoflineConstraint | RENAME CONSTRAINT <constraint_name> TO <new_constraint_name> | { ALTER | MODIFY } { CONSTRAINT <constraint_name> | PRIMARY KEY | UNIQUE | FOREIGN KEY } ( <col_name> [ , ... ] ) [ [ NOT ] ENFORCED ] [ VALIDATE | NOVALIDATE ] [ RELY | NORELY ] | DROP { CONSTRAINT <constraint_name> | PRIMARY KEY | UNIQUE | FOREIGN KEY } ( <col_name> [ , ... ] ) [ CASCADE | RESTRICT ] } outoflineConstraint ::= [ CONSTRAINT <constraint_name> ] { UNIQUE [ ( <col_name> [ , <col_name> , ... ] ) ] | PRIMARY KEY [ ( <col_name> [ , <col_name> , ... ] ) ] | [ FOREIGN KEY ] [ ( <col_name> [ , <col_name> , ... ] ) ] REFERENCES <ref_table_name> [ ( <ref_col_name> [ , <ref_col_name> , ... ] ) ] } [ <constraint_properties> ]Pour une syntaxe détaillée et des exemples de création/modification des contraintes hors ligne, voir CREATE | ALTER TABLE … CONSTRAINT.
searchOptimizationAction ::= { ADD SEARCH OPTIMIZATION [ ON <search_method_with_target> [ , <search_method_with_target> ... ] ] | DROP SEARCH OPTIMIZATION [ ON { <search_method_with_target> | <column_name> | <expression_id> } [ , ... ] ] }Pour plus de détails, voir Actions d’optimisation de la recherche (searchOptimizationAction).
Paramètres¶
name
Identifiant de la table à modifier. Si l’identificateur contient des espaces ou des caractères spéciaux, toute la chaîne doit être délimitée par des guillemets doubles. Les identificateurs entre guillemets doubles sont également sensibles à la casse.
RENAME TO new_table_name
Renomme la table spécifiée avec un nouvel identifiant qui n’est actuellement utilisé par aucune autre table du schéma.
Pour plus d’informations sur les identificateurs de table, voir Exigences relatives à l’identificateur.
Vous pouvez déplacer l’objet vers une autre base de données et/ou un autre schéma tout en renommant éventuellement l’objet. Pour ce faire, spécifiez une valeur
new_name
qualifiée qui inclut le nouveau nom de la base de données et/ou du schéma sous la formedb_name.schema_name.object_name
ouschema_name.object_name
, respectivement.Note
La base de données et/ou le schéma de destination doivent déjà exister. En outre, un objet portant le même nom ne peut pas déjà exister dans le nouvel emplacement ; sinon, l’instruction renvoie une erreur.
Le déplacement d’un objet vers un schéma d’accès géré est interdit sauf si le propriétaire de l’objet (c’est-à-dire le rôle qui a le privilège OWNERSHIP sur l’objet) est également propriétaire du schéma cible.
Lorsqu’un objet (table, colonne, etc.) est renommé, les autres objets qui le référencent doivent être mis à jour avec le nouveau nom.
SWAP WITH target_table_name
Swap renomme deux tables en une seule transaction.
Notez que l’échange d’une table permanente ou transitoire avec une table temporaire, qui ne persiste que pendant la durée de la session utilisateur au cours de laquelle elle a été créée, n’est pas autorisé. Cette restriction empêche un conflit de dénomination qui pourrait se produire lorsqu’une table temporaire est échangée avec une table permanente ou transitoire, et qu’une table permanente ou transitoire existante porte le même nom que la table temporaire. Pour échanger une table permanente ou transitoire avec une table temporaire, utilisez trois instructions
ALTER TABLE ... RENAME TO
: renommer la tablea
enc
,b
ena
, puisc
enb
.
Note
Pour renommer une table ou intervertir deux tables, le rôle utilisé pour effectuer l’opération doit avoir les privilèges OWNERSHIP sur la ou les tables. De plus, renommer une table nécessite le privilège CREATE TABLE sur le schéma de la table.
SET ...
Spécifie un(e) ou plusieurs paramètre(s)/propriété(s) à définir pour la table (séparés par des espaces, des virgules ou de nouvelles lignes) :
DATA_RETENTION_TIME_IN_DAYS = integer
Paramètre au niveau de l’objet qui modifie la période de conservation de la table pour Time Travel. Pour plus d’informations, voir Compréhension et utilisation de la fonction Time Travel et Utilisation de tables temporaires et transitoires.
Pour une description détaillée de ce paramètre, ainsi que pour plus d’informations sur les paramètres d’objet, voir Paramètres.
Valeurs :
Édition Standard :
0
ou1
Édition Enterprise :
0
à90
pour les tables permanentes0
ou1
pour les tables temporaires et transitoires
Note
Une valeur de
0
désactive effectivement Time Travel pour la table.MAX_DATA_EXTENSION_TIME_IN_DAYS = integer
Paramètre d’objet qui spécifie le nombre maximum de jours pendant lesquels Snowflake peut prolonger la période de conservation des données de la table, afin d’éviter que les flux sur la table ne deviennent obsolètes.
Pour une description détaillée de ce paramètre, voir MAX_DATA_EXTENSION_TIME_IN_DAYS.
CHANGE_TRACKING = TRUE | FALSE
Spécifie d’activer ou de désactiver le suivi des modifications sur la table.
TRUE
active le suivi des modifications sur la table. Cette option ajoute plusieurs colonnes masquées à la table source et commence à stocker les métadonnées de suivi des modifications dans les colonnes. Ces colonnes consomment une petite quantité de stockage.Les métadonnées de suivi des modifications peuvent être interrogées à l’aide de la clause CHANGES pour les instructions SELECT, ou en créant et en interrogeant un ou plusieurs flux sur la table.
FALSE
désactive le suivi des modifications sur la table. Les colonnes cachées associées sont supprimées de la table.
DEFAULT_DDL_COLLATION = 'collation_specification'
Spécifie une spécification de classement par défaut pour toutes les nouvelles colonnes ajoutées à la table.
La définition du paramètre ne modifie pas la spécification de classement des colonnes existantes.
Pour plus d’informations sur ce paramètre, voir DEFAULT_DDL_COLLATION.
ENABLE_SCHEMA_EVOLUTION = { TRUE | FALSE }
Active ou désactive les modifications automatiques du schéma de table à partir des données chargées dans la table depuis les fichiers sources, notamment :
Colonnes ajoutées.
Par défaut, l’évolution du schéma est limitée à un maximum de 10 colonnes ajoutées par opération de chargement. Pour demander plus de 10 colonnes ajoutées par opération de chargement, contactez le support Snowflake.
La contrainte NOT NULL peut être supprimée pour n’importe quel nombre de colonnes manquantes dans les nouveaux fichiers de données.
La valeur
TRUE
permet l’évolution automatique du schéma de table. La valeur par défautFALSE
désactive l’évolution automatique du schéma de table.Note
Le chargement de données à partir de fichiers fait évoluer les colonnes des tables lorsque toutes les conditions suivantes sont réunies :
L’instruction COPY INTO <table> inclut l’option
MATCH_BY_COLUMN_NAME
.Le rôle utilisé pour charger les données dispose du privilège EVOLVE SCHEMA ou OWNERSHIP sur la table.
En outre, pour l’évolution du schéma avec CSV, lorsqu’il est utilisé avec
MATCH_BY_COLUMN_NAME
etPARSE_HEADER
,ERROR_ON_COLUMN_COUNT_MISMATCH
doit être défini comme faux.COMMENT = 'string_literal'
Ajoute un commentaire ou écrase le commentaire existant pour la table.
Note
Ne spécifiez pas d’options de copie à l’aide des commandes CREATE STAGE, ALTER STAGE, CREATE TABLE ou ALTER TABLE. Nous vous recommandons d’utiliser la commande COPY INTO <table> pour spécifier les options de copie.
UNSET ...
Spécifie un(e) ou plusieurs paramètres/propriété(s) à désactiver pour la table, ce qui les réinitialise à leurs valeurs par défaut :
DATA_RETENTION_TIME_IN_DAYS
MAX_DATA_EXTENSION_TIME_IN_DAYS
CHANGE_TRACKING
DEFAULT_DDL_COLLATION
ENABLE_SCHEMA_EVOLUTION
COMMENT
Actions de clustering (clusteringAction
)¶
CLUSTER BY ( expr [ , expr , ... ] )
Spécifie (ou modifie) une ou plusieurs colonnes de table ou expressions de colonne en tant que clé de clustering pour la table. Ce sont les colonnes/expressions pour lesquelles le clustering est assuré par le clustering automatique.
Important
Les clés de clustering ne sont pas recommandées ni conçues pour toutes les tables. Elles sont généralement intéressantes pour les tables très importantes (de plusieurs téraoctets).
Avant de spécifier une clé de clustering pour une table, consultez Fonctionnement des structures de table dans Snowflake.
RECLUSTER ...
Obsolète
Effectue un regroupement manuel et incrémentiel d’une table dont la clé de clustering est définie :
MAX_SIZE = budget_in_bytes
Obsolète — utiliser un entrepôt plus grand pour obtenir un reclustering manuel plus efficace
Spécifie la limite supérieure de la quantité de données (en octets) dans la table à regrouper.
WHERE condition
Spécifie une condition ou une plage sur laquelle regrouper les données dans la table.
Note
Seuls les rôles avec le privilège OWNERSHIP ou INSERT sur une table peuvent regrouper la table.
SUSPEND | RESUME RECLUSTER
Active ou désactive Clustering automatique pour la table.
DROP CLUSTERING KEY
Détruit la clé de clustering pour la table.
Pour plus d’informations sur les clés de clustering et le reclustering à proprement parler, voir Fonctionnement des structures de table dans Snowflake.
Actions de la colonne de table (tableColumnAction
)¶
ADD [ COLUMN ] [ IF NOT EXISTS ] col_name col_data_type
.[ DEFAULT default_value | AUTOINCREMENT ... ]
.[ inlineConstraint ]
[ COLLATE 'collation_specification' ]
.[ [ WITH ] MASKING POLICY policy_name ]
.[ [ WITH ] PROJECTION POLICY policy_name ]
.[ [ WITH ] TAG ( tag_name = 'tag_value' [ , tag_name = 'tag_value' , ... ] ) ] [ , ...]
Ajoute une nouvelle colonne. Vous pouvez spécifier une valeur par défaut, une contrainte en ligne, une spécification de classement, une politique de masquage et/ou une ou plusieurs balises.
La valeur par défaut d’une colonne que vous ajoutez doit être une valeur littérale ; il ne peut pas s’agir d’une expression ni d’une valeur renvoyée par une fonction. Par exemple, la commande suivante renvoie une erreur prévue :
ALTER TABLE t1 ADD COLUMN c5 VARCHAR DEFAULT 12345::VARCHAR;
002263 (22000): SQL compilation error: Invalid column default expression [CAST(12345 AS VARCHAR(16777216))]
Lorsque vous commencez par créer une table, vous pouvez utiliser des expressions comme valeurs par défaut, mais pas lorsque vous ajoutez des colonnes.
La valeur par défaut d’une colonne doit correspondre au type de données de la colonne. Une tentative de définition d’une valeur par défaut avec un type de données non correspondant se solde par une erreur. Par exemple :
ALTER TABLE t1 ADD COLUMN c6 DATE DEFAULT '20230101';
002023 (22000): SQL compilation error: Expression type does not match column data type, expecting DATE but got VARCHAR(8) for column C6
Pour plus d’informations sur les actions des colonnes de table, voir :
Les opérations ADD COLUMN peuvent être effectuées sur plusieurs colonnes dans la même commande.
Si vous n’êtes pas sûr que la colonne existe déjà, vous pouvez spécifier IF NOT EXISTS lors de l’ajout de la colonne. Si la colonne existe déjà, ADD COLUMN n’a aucun effet sur la colonne existante et n’entraîne pas d’erreur.
Note
Vous ne pouvez pas spécifier IF NOT EXISTS si vous spécifiez également l’un des éléments suivants pour la nouvelle colonne :
DEFAULT, AUTOINCREMENT ou IDENTITY
UNIQUE, PRIMARY KEY ou FOREIGN KEY
RENAME COLUMN col_name to new_col_name
Renomme la colonne spécifiée en un nouveau nom qui n’est actuellement utilisé pour aucune autre colonne de la table.
Vous ne pouvez pas renommer une colonne qui fait partie d’une clé de clustering.
Lorsqu’un objet (table, colonne, etc.) est renommé, les autres objets qui le référencent doivent être mis à jour avec le nouveau nom.
DROP COLUMN [ IF EXISTS ] col_name [ CASCADE | RESTRICT ]
Supprime la colonne spécifiée de la table.
Si vous n’êtes pas sûr que la colonne existe déjà, vous pouvez spécifier IF EXISTS lors de la suppression de la colonne. Si la colonne n’existe pas, DROP COLUMN n’a aucun effet et n’entraîne pas d’erreur.
La destruction d’une colonne est une opération comportant uniquement des métadonnées. Elle ne réécrit pas immédiatement la ou les micro-partitions et ne libère donc pas immédiatement l’espace utilisé par la colonne. En règle générale, l’espace d’une micro-partition est libéré lors de la réécriture de la micro-partition, généralement lorsqu’une écriture est effectuée en raison d’une opération DML (INSERT, UPDATE, DELETE) ou un re-clustering.
Actions de la fonction de métrique des données (dataMetricFunctionAction
)¶
DATA_METRIC_SCHEDULE ...
Spécifie la planification de l’exécution périodique de la fonction de métrique des données.
'num MINUTE'
Spécifie un intervalle (en minutes) de temps d’attente inséré entre les exécutions de la fonction de métrique des données. Accepte uniquement les entiers positifs.
Prend également en charge la syntaxe
num M
.Pour les fonctions de métrique des données, utilisez l’une des valeurs suivantes :
5
,15
,30
,60
,720
ou1440
.'USING CRON expr time_zone'
Spécifie une expression cron et un fuseau horaire pour l’exécution périodique de la fonction de métrique des données. Prend en charge un sous-ensemble de la syntaxe standard de l’utilitaire cron.
Pour une liste de fuseaux horaires, voir la Liste des fuseaux horaires de la base de données tz.
L’expression cron se compose des champs suivants et l’intervalle périodique doit être d’au moins 5 minutes :
# __________ minute (0-59) # | ________ hour (0-23) # | | ______ day of month (1-31, or L) # | | | ____ month (1-12, JAN-DEC) # | | | | _ day of week (0-6, SUN-SAT, or L) # | | | | | # | | | | | * * * * *
Les caractères spéciaux suivants sont acceptés :
*
Caractère générique. Spécifie toute occurrence du champ.
L
Signifie « dernier ». Lorsqu’il est utilisé dans le champ du jour de la semaine, il vous permet de spécifier des constructions telles que « le dernier vendredi » (« 5L ») d’un mois donné. Dans le champ du mois, il spécifie le dernier jour du mois.
/{n}
Indique l’instance n d’une unité de temps donnée. Chaque quanta de temps est calculé indépendamment. Par exemple, si
4/3
est spécifié dans le champ du mois, la fonction de métrique des données est planifiée pour avril, juillet et octobre (c’est-à-dire tous les 3 mois, à partir du 4e mois de l’année). Le même calendrier est maintenu les années suivantes. En d’autres termes, la fonction de métrique des données n’est pas planifiée pour être exécutée en janvier (3 mois après l’exécution d’octobre).
Note
L’expression cron est actuellement évaluée par rapport au fuseau horaire spécifié. La modification de la valeur du paramètre TIMEZONE pour le compte (ou la définition de la valeur au niveau de l’utilisateur ou de la session) ne modifie pas le fuseau horaire de la fonction de métrique des données.
L’expression cron définit tous les moments d’exécution valides de la fonction de métrique des données. Snowflake tente d’exécuter une fonction de métrique des données en fonction de cette planification ; toutefois, tout moment d’exécution valide est ignoré si une exécution précédente n’a pas été terminée avant le début du moment d’exécution valide suivant.
Lorsqu’un jour de mois et un jour de semaine spécifiques sont inclus dans l’expression cron, la fonction de métrique des données est planifiée les jours correspondant au jour du mois ou au jour de la semaine. Par exemple,
DATA_METRIC_SCHEDULE = 'USING CRON 0 0 10-20 * TUE,THU UTC'
planifie une fonction de métrique des données à 0AM entre le 10e et le 20e jour du mois ainsi que le mardi ou le jeudi en dehors de ces dates.La granularité de temps la plus courte en cron est la minute.
Si une fonction de métrique des données est reprise pendant la minute définie dans son expression cron, la première exécution planifiée de la fonction de métrique des données est la prochaine occurrence de l’instance de l’expression cron. Par exemple, si une fonction de métrique des données planifiée pour s’exécuter quotidiennement à minuit (
USING CRON 0 0 * * *
) est reprise à minuit + 5 secondes (00:00:05
), la première exécution de la fonction de métrique des données est planifiée pour la prochaine fois qu’il sera minuit.
'TRIGGER_ON_CHANGES'
Spécifie que la DMF s’exécute lorsqu’une opération DML modifie la table, comme l’insertion d’une nouvelle ligne ou la suppression d’une ligne.
Vous pouvez spécifier
'TRIGGER_ON_CHANGES'
pour les objets suivants :Tables dynamiques
Tables externes
Tables Apache Iceberg™
Tables ordinaires
Tables temporaires
Tables transitoires
Les modifications apportées à la table à la suite du reclustering ne déclenchent pas l’exécution de la DMF.
{ ADD | DROP } DATA METRIC FUNCTION metric_name
Identificateur de la fonction de métrique des données à ajouter à la table ou à la vue ou à supprimer dans la table ou la vue.
ON ( col_name [ , ... ] )
Colonnes de table ou de vue auxquelles associer la fonction de métrique des données. Les types de données des colonnes doivent correspondre aux types de données des colonnes spécifiées dans la définition de la fonction de métrique des données.
[ , metric_name_2 ON ( col_name [ , ... ] ) [ , ... ] ]
Fonctions de métrique des données supplémentaires à ajouter à la table ou à la vue. Utilisez une virgule pour séparer chaque fonction de métrique des données et ses colonnes spécifiées.
MODIFY DATA METRIC FUNCTION metric_name
Identificateur de la fonction de métrique des données à modifier.
ON ( col_name [ , ... ] ) { SUSPEND | RESUME }
Suspend ou reprend la fonction de métrique des données sur les colonnes spécifiées. Lorsqu’une fonction de métrique des données est définie pour une table ou une vue, la fonction de métrique des données est automatiquement incluse dans la planification.
SUSPEND
supprime la fonction de métrique des données du calendrier.RESUME
ramène une fonction de métrique des données suspendue dans le calendrier.
[ , metric_name_2 ON ( col_name [ , ... ] ) [ , ... ] { SUSPEND | RESUME } ]
Fonctions de métrique des données supplémentaires à suspendre ou à reprendre. Utilisez une virgule pour séparer chaque fonction de métrique des données et ses colonnes spécifiées.
Pour des détails sur les conditions de contrôle d’accès pour ces actions, voir Privilèges des DMF.
Actions de la colonne de table externe (extTableColumnAction
)¶
Pour toutes les autres modifications de table externes, voir ALTER EXTERNAL TABLE.
ADD [ COLUMN ] [ IF NOT EXISTS ] <col_name> <col_type> AS ( <expr> ) [, ...]
Ajoute une nouvelle colonne à la table externe.
Si vous n’êtes pas sûr que la colonne existe déjà, vous pouvez spécifier IF NOT EXISTS lors de l’ajout de la colonne. Si la colonne existe déjà, ADD COLUMN n’a aucun effet sur la colonne existante et n’entraîne pas d’erreur.
Cette opération peut être effectuée sur plusieurs colonnes d’une même commande.
col_name
Chaîne qui indique l’identificateur de colonne (c’est-à-dire le nom). Toutes les exigences relatives aux identificateurs de table s’appliquent également aux identificateurs de colonne.
Pour plus d’informations, voir Exigences relatives à l’identificateur.
col_type
Chaîne (constante) qui spécifie le type de données pour la colonne. Le type de données doit correspondre au résultat de
expr
pour la colonne.Pour plus de détails sur les types de données qui peuvent être spécifiés pour les colonnes de la table, voir Référence de types de données SQL.
expr
Chaîne qui spécifie l’expression de la colonne. Lorsqu’elle est interrogée, la colonne renvoie les résultats dérivés de cette expression.
Les colonnes de table externes sont des colonnes virtuelles définies à l’aide d’une expression explicite. Ajouter des colonnes virtuelles sous forme d’expressions en utilisant la colonne VALUE et/ou la pseudo-colonne METADATA$FILENAME :
- VALUE:
Une colonne de type VARIANT qui représente une seule ligne du fichier externe.
- CSV:
La colonne VALUE structure chaque ligne comme un objet dont les éléments sont identifiés par la position de la colonne (c’est-à-dire
{c1: <colonne_1_valeur>, c2: <colonne_2_valeur>, c3: <colonne_1_valeur> ...}
).Par exemple, ajoutez une colonne VARCHAR nommée
mycol
qui fait référence à la première colonne des fichiers CSV en zone de préparation :mycol varchar as (value:c1::varchar)
- Données semi-structurées:
Mettez les noms et les valeurs des éléments entre guillemets. Parcourez le chemin dans la colonne VALUE en utilisant la notation par points.
Par exemple, supposons que l’exemple suivant représente une seule ligne de données semi-structurées dans un fichier en zone de préparation :
{ "a":"1", "b": { "c":"2", "d":"3" } }
Ajoutez une colonne VARCHAR nommée
mycol
qui fait référence à l’élément répétitif imbriquéc
dans le fichier en zone de préparation :mycol varchar as (value:"b"."c"::varchar)
- METADATA$FILENAME:
Une pseudo-colonne qui identifie le nom de chaque fichier de données en zone de préparation inclus dans la table externe, y compris son chemin dans la zone de préparation.
RENAME COLUMN col_name to new_col_name
Renomme la colonne spécifiée en un nouveau nom qui n’est actuellement utilisé pour aucune autre colonne de la table externe.
DROP COLUMN [ IF EXISTS ] col_name
Supprime la colonne spécifiée de la table externe.
Si vous n’êtes pas sûr que la colonne existe déjà, vous pouvez spécifier IF EXISTS lors de la suppression de la colonne. Si la colonne n’existe pas, DROP COLUMN n’a aucun effet et n’entraîne pas d’erreur.
Actions de contrainte (constraintAction
)¶
ADD CONSTRAINT
Ajoute une contrainte d’intégrité hors ligne à une ou plusieurs colonnes de la table. Pour ajouter une contrainte en ligne (pour une colonne), voir Actions de la colonne (dans ce chapitre).
RENAME CONSTRAINT constraint_name TO new_constraint_name
Renomme la contrainte spécifiée.
ALTER | MODIFY CONSTRAINT ...
Modifie les propriétés de la contrainte spécifiée.
DROP CONSTRAINT constraint_name | PRIMARY KEY | UNIQUE | FOREIGN KEY ( col_name [ , ... ] ) [ CASCADE | RESTRICT ]
Détruit la contrainte spécifiée pour la colonne ou l’ensemble de colonnes spécifié.
Pour une syntaxe détaillée et des exemples d’ajout ou de modification de contraintes, voir CREATE | ALTER TABLE … CONSTRAINT.
Politique de gouvernance des données et actions de balises (dataGovnPolicyTagAction
)¶
TAG tag_name = 'tag_value' [ , tag_name = 'tag_value' , ... ]
Spécifie le nom de la balise et la valeur de la chaîne de la balise.
La valeur de la balise est toujours une chaîne de caractères et le nombre maximum de caractères pour la valeur de la balise est 256.
Pour plus d’informations sur la spécification des balises dans une instruction, voir Quotas de balises pour les objets et les colonnes.
policy_name
Identificateur de la politique ; doit être unique pour votre schéma.
Les clauses suivantes s’appliquent à tous les types de tables qui prennent en charge les politiques d’accès aux lignes, notamment les tables, les vues et les tables d’événements. Pour simplifier, les clauses font simplement référence à la « table ».
ADD ROW ACCESS POLICY policy_name ON (col_name [ , ... ])
Ajoutez la politique d’accès aux lignes à la table.
Au moins un nom de colonne doit être spécifié. Des colonnes supplémentaires peuvent être spécifiées en séparant chaque nom de colonne par une virgule. Utilisez cette expression pour ajouter une politique d’accès aux lignes à la fois à une table d’événements et à une table externe.
DROP ROW ACCESS POLICY policy_name
Supprime une politique d’accès aux lignes de la table.
Utilisez cette clause pour supprimer la politique de la table.
DROP ROW ACCESS POLICY policy_name, ADD ROW ACCESS POLICY policy_name ON ( col_name [ , ... ] )
Supprime la politique d’accès aux lignes définie sur la table et ajoute une politique d’accès aux lignes pour la même table en une seule instruction SQL.
DROP ALL ROW ACCESS POLICIES
Supprime toutes les associations de politique d’accès aux lignes d’une table.
Cette expression est utile lorsqu’une politique d’accès aux lignes est détruite d’un schéma avant de détruire la politique d’une table d’événements. Utilisez cette expression pour supprimer les associations de politiques d’accès aux ligne de la table.
SET AGGREGATION POLICY policy_name
[ ENTITY KEY (col_name [ , ... ]) ] [ FORCE ]
Attribue une politique d’agrégation à la table.
Utilisez le paramètre ENTITY KEY facultatif pour définir les colonnes qui identifient de manière unique une entité dans la table. Pour plus d’informations, voir Mise en œuvre de la protection de la confidentialité au niveau de l’entité à l’aide de politiques d’agrégation.
Utilisez le paramètre facultatif FORCE pour remplacer atomiquement une politique d’agrégation existante par la nouvelle politique d’agrégation.
UNSET AGGREGATION POLICY
Détache une politique d’agrégation de la table.
{ ALTER | MODIFY } [ COLUMN ] ...
USING ( col_name , cond_col_1 ... )
Spécifie les arguments à passer dans l’expression SQL de la politique de masquage conditionnelle.
La première colonne de la liste spécifie la colonne pour les conditions de la politique de masquage ou de tokenisation des données et doit correspondre à la colonne à laquelle la politique de masquage est définie.
Les colonnes supplémentaires spécifient les colonnes à évaluer pour déterminer s’il faut masquer ou tokeniser les données de chaque ligne du résultat de la requête lorsqu’une requête est effectuée sur la première colonne.
Si la clause USING est omise, Snowflake traite la politique de masquage conditionnelle comme une politique de masquage normale.
FORCE
Remplace une politique de masquage ou de projection actuellement définie sur une colonne par une politique différente dans une seule instruction.
Notez que l’utilisation du mot-clé
FORCE
avec une politique de masquage exige que le type de données de la politique dans l’instruction ALTER TABLE (c’est-à-dire STRING) corresponde au type de données de la politique de masquage actuellement définie sur la colonne (c’est-à-dire STRING).Si aucune politique de masquage n’est actuellement définie sur la colonne, la spécification de ce mot-clé n’a aucun effet.
Pour plus de détails, voir : Remplacez une politique de masquage sur une colonne ou Remplacement d’une politique de projection.
Actions d’optimisation de la recherche (searchOptimizationAction
)¶
ADD SEARCH OPTIMIZATION
Ajoute l’optimisation de recherche pour la table entière ou, si vous spécifiez la clause ON facultative, pour des colonnes spécifiques.
Remarque :
L’optimisation de la recherche peut être coûteuse à maintenir, en particulier si les données du tableau changent fréquemment. Pour plus d’informations, voir Optimisation de la recherche - Estimation et gestion des coûts.
Si vous essayez d’ajouter une optimisation de recherche sur une vue matérialisée, Snowflake renvoie un message d’erreur.
ON search_method_with_target [, search_method_with_target ... ]
Spécifie que vous voulez configurer l’optimisation de la recherche pour des colonnes ou des champs VARIANT spécifiques (plutôt que pour la table entière).
Pour
search_method_with_target
, utilisez une expression avec la syntaxe suivante :<search_method>( <target> [ , <target> , ... ] [ , ANALYZER => '<analyzer_name>' ] )
Où :
search_method
spécifie l’une des méthodes suivantes qui optimisent les requêtes pour un type particulier de prédicat :Méthode de recherche
Description
FULL_TEXT
Prédicats qui utilisent les types VARCHAR (texte), VARIANT, ARRAY et OBJECT.
EQUALITY
Prédicats d’égalité et IN
SUBSTRING
Prédicats qui correspondent à des sous-chaînes et à des expressions régulières (par exemple, [ NOT ] LIKE, [ NOT ] ILIKE, [ NOT ] RLIKE, REGEXP_LIKE, etc.)
GEO
Prédicats qui utilisent des types GEOGRAPHY.
target
spécifie la colonne, le champ VARIANT ou un astérisque (*).En fonction de la valeur de
search_method
, vous pouvez spécifier une colonne ou un champ VARIANT de l’un des types suivants :Méthode de recherche
Cibles prises en charge
FULL_TEXT
Colonnes de types de données VARCHAR (texte), VARIANT, ARRAY et OBJECT, y compris les chemins d’accès aux champs dans des VARIANTs.
EQUALITY
Colonnes de types numérique, chaîne, binaire et VARIANT, y compris les chemins d’accès aux champs dans des VARIANTs.
SUBSTRING
Colonnes de types de données chaîne ou VARIANT, y compris les chemins d’accès aux champs dans VARIANTs. Spécifiez les chemins d’accès aux champs comme décrit ci-dessus sous
EQUALITY
; les recherches sur les champs imbriqués sont améliorées de la même manière.GEO
Colonnes du type de données GEOGRAPHY
Pour spécifier un champ VARIANT, utilisez le point ou la notation entre crochets (par exemple
my_column:my_field_name.my_nested_field_name
oumy_column['my_field_name']['my_nested_field_name']
). Vous pouvez également utiliser un chemin d’accès au champ délimité par deux points (par exemple,my_column:my_field_name:my_nested_field_name
).Lorsque vous spécifiez un champ VARIANT, la configuration s’applique à tous les champs imbriqués sous ce champ. Par exemple, si vous spécifiez
ON EQUALITY(src:a.b)
:Cette configuration peut améliorer les requêtes
on src:a.b
et sur tous les champs imbriqués (par exemplesrc:a.b.c
,src:a.b.c.d
, etc.).Cette configuration n’affecte pas les requêtes qui n’utilisent pas le préfixe
src:a.b
(par exemple,src:a
,src:z
, etc.).
Pour spécifier toutes les colonnes applicables de la tableau comme cibles, utilisez un astérisque (
*
).Notez que vous ne pouvez pas spécifier à la fois un astérisque et des noms de colonnes spécifiques pour une méthode de recherche donnée. Cependant, vous pouvez spécifier un astérisque dans différentes méthodes de recherche.
Par exemple, vous pouvez spécifier les expressions suivantes :
-- Allowed ON SUBSTRING(*) ON EQUALITY(*), SUBSTRING(*), GEO(*)
Vous ne pouvez pas spécifier les expressions suivantes :
-- Not allowed ON EQUALITY(*, c1) ON EQUALITY(c1, *) ON EQUALITY(v1:path, *) ON EQUALITY(c1), EQUALITY(*)
ANALYZER => 'analyzer_name'
spécifie le nom de l’analyseur de texte, sisearch_method
estFULL_TEXT
.Lorsque la méthode de recherche
FULL_TEXT
est utilisée et les requêtes sont exécutées avec la fonction SEARCH ou SEARCH_IP, l’analyseur divise les termes de recherche (et le texte de la colonne recherchée) en jetons. Une ligne correspond si l’un des jetons extraits de la chaîne de recherche correspond à un jeton extrait de l’une des colonnes ou des champs recherchés. L’analyseur n’est pas pertinent lorsque la méthode de rechercheFULL_TEXT
n’est pas utilisée ou pour les requêtes qui n’utilisent pas la fonctionSEARCH ou SEARCH_IP.L’analyseur tokenise une chaîne en la cassant là où il trouve certains délimiteurs. Ces délimiteurs ne sont pas inclus dans les jetons résultants et les jetons vides ne sont pas extraits.
Ce paramètre accepte une des valeurs suivantes :
DEFAULT_ANALYZER : divise le texte en jetons en fonction des délimiteurs suivants :
Caractère
Code Unicode
Description
U+0020
Espace
[
U+005B
Crochet gauche
]
U+005D
Crochet droit
;
U+003B
Point-virgule
<
U+003C
Signe inférieur à
>
U+003E
Signe supérieur à
(
U+0028
Parenthèse gauche
)
U+0029
Parenthèse droite
{
U+007B
Accolade gauche
}
U+007D
Accolade droite
|
U+007C
Barre verticale
!
U+0021
Point d’exclamation
,
U+002C
Virgule
'
U+0027
Apostrophe
"
U+0022
Guillemets
*
U+002A
Astérisque
&
U+0026
Esperluette
?
U+003F
Point d’interrogation
+
U+002B
Signe plus
/
U+002F
Barre oblique
:
U+003A
Deux-points
=
U+003D
Signe égal
@
U+0040
Arobase
.
U+002E
Point (point final)
-
U+002D
Trait d’union
$
U+0024
Symbole du dollar
%
U+0025
Signe de pourcentage
\
U+005C
Barre oblique inverse
_
U+005F
Trait de soulignement (ligne basse)
\n
U+000A
Nouvelle ligne (saut de ligne)
\r
U+000D
Retour chariot
\t
U+0009
Onglet horizontal
UNICODE_ANALYZER : tokenise en fonction des règles de segmentation Unicode qui traitent les espaces et certains caractères de ponctuation comme des délimiteurs. Ces règles internes sont conçues pour les recherches en langage naturel (dans de nombreuses langues différentes). Par exemple, l’analyseur par défaut traite les périodes dans les adresses IP et les apostrophes dans les contractions comme délimiteurs, mais l’analyseur Unicode ne le fait pas. Voir Utiliser un analyseur pour ajuster le comportement de recherche.
Pour plus d’informations sur l’algorithme de segmentation de texte Unicode, consultez https://unicode.org/reports/tr29/.
NO_OP_ANALYZER : ne tokenise ni les données ni la chaîne de requête. Un terme de recherche doit correspondre exactement au texte intégral d’une colonne ou d’un champ, y compris la sensibilité à la casse ; sinon, la fonction SEARCH renvoie FALSE. Même si la chaîne de requête semble contenir plusieurs jetons (par exemple,
'sky blue'
), la colonne ou le champ doit être exactement égal à la chaîne de requête entière. Dans ce cas, seulement'sky blue'
est une correspondance ;'sky'
et'blue'
ne sont pas des correspondances.ENTITY_ANALYZER : tokenise les données pour les recherches d’adresses IP.
Cet analyseur est utilisé uniquement pour les requêtes exécutées avec la fonction SEARCH_IP.
Pour spécifier plus d’une méthode de recherche sur une cible, utilisez une virgule pour séparer chaque méthode ultérieure et chaque cible :
ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c1), EQUALITY(c2, c3);
Si vous exécutez la commande ALTER TABLE … ADD SEARCH OPTIMIZATION ON … sur la même table, chaque commande suivante s’ajoute à la configuration existante pour la table. Par exemple, supposons que vous ayez exécuté la commande suivante :
ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c1, c2); ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c3, c4);
Cela ajoute des prédicats d’égalité pour les colonnes c1, c2, c3 et c4 à la configuration de la table. Ceci est équivalent à l’exécution de la commande :
ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c1, c2, c3, c4);
Pour des exemples, voir Configuration de l’optimisation de la recherche pour des colonnes spécifiques.
DROP SEARCH OPTIMIZATION
Supprime l’optimisation de recherche pour l’ensemble de la table ou, si vous spécifiez la clause ON facultative, pour des colonnes spécifiques.
Remarque :
Si une table a la propriété d’optimisation de recherche, alors le fait de supprimer et de rétablir la table préserve la propriété d’optimisation de recherche.
La suppression de la propriété d’optimisation de recherche d’une table puis son rétablissement entraînent le même coût que lors du premier ajout.
ON search_method_with_target | column_name | expression_id [ , ... ]
Spécifie que vous voulez détruire la configuration de l’optimisation de la recherche pour des colonnes ou des champs VARIANT spécifiques (plutôt que de détruire l’optimisation de la recherche pour la table entière).
Pour identifier la configuration de la colonne à détruire, spécifiez l’un des éléments suivants :
Pour
search_method_with_target
, spécifiez une méthode d’optimisation des requêtes pour une ou plusieurs cibles spécifiques, qui peuvent être des colonnes ou des champs VARIANT. Utilisez la syntaxe décrite précédemment.Pour
column_name
, spécifiez le nom de la colonne configurée pour l’optimisation de la recherche. La spécification du nom de la colonne détruit toutes les expressions pour cette colonne, y compris les expressions qui utilisent les champs VARIANT de la colonne.Pour
expression_id
, spécifiez l’ID d’une expression figurant dans la sortie de la commande DESCRIBE SEARCH OPTIMIZATION.
Pour en spécifier plusieurs, utilisez une virgule entre les éléments.
Vous pouvez spécifier toute combinaison de méthodes de recherche avec des cibles, des noms de colonnes et des IDs d’expressions.
Pour des exemples, voir Suppression de l’optimisation de la recherche pour des colonnes spécifiques.
Notes sur l’utilisation : Généralités¶
Les modifications apportées à une table ne sont pas automatiquement propagées aux vues créées sur cette table. Par exemple, si vous détruisez une colonne dans une table et qu’une vue est définie pour inclure cette colonne, la vue n’est plus valide. La vue n’est pas ajustée pour supprimer la colonne.
Le fait de supprimer une colonne ne libère pas immédiatement l’espace de stockage de la colonne.
L’espace dans chaque micro-partition n’est pas récupéré tant que cette micro-partition n’est pas réécrite. Les opérations d’écriture (insertion, mise à jour, suppression, etc.) sur 1 ou plusieurs lignes de cette micro-partition entraînent la réécriture de la micro-partition. Si vous souhaitez forcer la récupération de l’espace, vous pouvez suivre les étapes suivantes :
Utilisez une instruction CREATE TABLE AS SELECT (CTAS) pour créer une nouvelle table contenant uniquement les colonnes de l’ancienne table que vous souhaitez conserver.
Définissez le paramètre DATA_RETENTION_TIME_IN_DAYS sur
0
pour l’ancienne table (facultatif).Supprimez la table.
Si la table est protégée par la fonctionnalité Time Travel, l’espace utilisé par le stockage Time Travel n’est pas récupéré avant l’expiration de la période de conservation de Time Travel.
Si une nouvelle colonne avec une valeur par défaut est ajoutée à une table avec des lignes existantes, toutes les lignes existantes sont remplies avec la valeur par défaut.
L’ajout d’une nouvelle colonne avec une valeur par défaut contenant une fonction n’est pas pris en charge actuellement. L’erreur suivante est renvoyée :
Invalid column default expression (expr)
Pour modifier une table, vous devez utiliser un rôle disposant du privilège de propriété sur la table.
Pour ajouter un clustering à une table, vous devez également disposer des privilèges USAGE ou OWNERSHIP sur le schéma et la base de données qui contiennent la table.
Pour les politiques de masquage :
La clause
USING
et le mot-cléFORCE
sont tous deux facultatifs ; ils ne sont pas nécessaires pour définir une politique de masquage sur une colonne. La clauseUSING
et le mot-cléFORCE
peuvent être utilisés séparément ou ensemble. Pour plus de détails, voir :Une seule politique de masquage qui utilise des colonnes conditionnelles peut être appliquée à plusieurs tables, à condition que la structure des colonnes de la table corresponde aux colonnes spécifiées dans la politique.
Lorsque vous modifiez une ou plusieurs colonnes de la table avec une politique de masquage ou la table elle-même avec une politique d’accès aux lignes, utilisez la fonction POLICY_CONTEXT pour simuler une requête sur la ou les colonnes protégées par une politique de masquage et la table protégée par une politique d’accès aux lignes.
Pour les politiques d’accès aux lignes :
Snowflake prend en charge l’ajout et la suppression des politiques d’accès aux lignes dans une seule instruction SQL.
Par exemple, pour remplacer une politique d’accès aux lignes déjà définie sur une table par une politique différente, il faut d’abord détruire la politique d’accès aux lignes, puis ajouter la nouvelle politique d’accès aux lignes.
Pour une ressource donnée (c’est-à-dire une table ou une vue), pour
ADD
ouDROP
une politique d’accès aux lignes, vous devez disposer du privilège APPLY ROW ACCESS POLICY sur le schéma, ou du privilège OWNERSHIP sur la ressource et du privilège APPLY sur la ressource de la politique d’accès aux lignes.Une table ou une vue ne peut être protégée que par une seule politique d’accès aux lignes à la fois. L’ajout d’une politique échoue si le corps de la politique fait référence à une colonne de table ou de vue qui est protégée par une politique d’accès aux lignes ou à la colonne protégée par une politique de masquage.
De même, l’ajout d’une politique de masquage à une colonne de table échoue si le corps de la politique de masquage fait référence à une table qui est protégée par une politique d’accès aux lignes ou une autre politique de masquage.
Les politiques d’accès aux lignes ne peuvent pas être appliquées aux vues système ou aux fonctions de table.
Comme pour les autres opérations DROP <objet>, Snowflake renvoie une erreur en cas de tentative de destruction d’une politique d’accès aux lignes d’une ressource à laquelle aucune politique d’accès aux lignes n’a été ajoutée.
Si un objet possède à la fois une politique d’accès aux lignes et une ou plusieurs politiques de masquage, la politique d’accès aux lignes est évaluée en premier.
Si vous créez une clé étrangère, les colonnes de la clause REFERENCES doivent être répertoriées dans le même ordre que les celles répertoriées pour la clé primaire. Par exemple :
CREATE TABLE parent ... CONSTRAINT primary_key_1 PRIMARY KEY (c_1, c_2) ... CREATE TABLE child ... CONSTRAINT foreign_key_1 FOREIGN KEY (...) REFERENCES parent (c_1, c_2) ...
Dans les deux cas, l’ordre des colonnes est
c_1, c_2
. Si l’ordre des colonnes de la clé étrangère avait été différent (par exemple,c_2, c_1
), la tentative de création de la clé étrangère aurait échoué.
Concernant les métadonnées :
Attention
Les clients doivent s’assurer qu’aucune donnée personnelle (autre que pour un objet utilisateur), donnée sensible, donnée à exportation contrôlée ou autre donnée réglementée n’est saisie comme métadonnée lors de l’utilisation du service Snowflake. Pour plus d’informations, voir Champs de métadonnées dans Snowflake.
ALTER TABLE … CHANGE_TRACKING = TRUE
Lorsqu’une table est modifiée pour permettre le suivi des modifications, elle est verrouillée pour la durée de l’opération. Les verrous peuvent entraîner une latence avec certaines opérations DDL/DML associées. Pour plus d’informations, reportez-vous à Verrouillage des ressources.
Index dans les tables hybrides :
Lorsque vous utilisez la commande ALTER TABLE pour ajouter ou supprimer une contrainte de clé unique ou étrangère dans une table hybride, l’index correspondant sera également créé ou supprimé. Pour plus d’informations sur les index dans une table hybride, voir CREATE INDEX.
Les contraintes de clés étrangères ne sont prises en charge que pour les tables hybrides stockées dans la même base de données. La possibilité de déplacer une table hybride d’une base de données à une autre n’est pas prise en charge. Les contraintes de clé primaire, unique et étrangère définies sur les tables hybrides ont leur champ RELY marqué comme
TRUE
.Une colonne utilisée par un index ne peut pas être supprimée avant que l’index correspondant ne le soit.
Notes sur l’utilisation : Fonctions de métrique des données¶
- Ajoutez une DMF à une table :
Avant d’ajouter une fonction de métrique des données à une table, procédez comme suit :
Définissez la planification d’exécution de la fonction de métrique des données. Pour plus de détails, voir DATA_METRIC_SCHEDULE.
Configurez la table d’événements dans laquelle stocker les résultats de l’appel auprès de la fonction de métrique des données. Pour plus de détails, voir Afficher les résultats de la DMF.
Assurez-vous que la table ou la vue n’est pas accordée à un partage, car vous ne pouvez pas définir de fonction de métrique des données sur une table ou une vue partagée.
En outre :
Vous pouvez ajouter une fonction de métrique des données à une table, une table externe, une vue ou une vue matérialisée. Vous ne pouvez définir de fonction de métrique des données sur aucun autre type de table tel qu’une table dynamique.
Lorsque vous spécifiez une colonne, Snowflake utilise la position ordinale. Si vous renommez une colonne après avoir ajouté une fonction de métrique des données à la table ou à la vue, l’association de la fonction de métrique des données à la colonne reste valide.
Une seule fonction de métrique des données de ce type peut être ajoutée à une colonne. Par exemple, une fonction de métrique des données NULL_COUNT ne peut pas être ajoutée à deux reprises à une même colonne.
Si vous supprimez une colonne après avoir ajouté une fonction de métrique des données qui fait référence à la colonne, Snowflake ne peut pas évaluer la fonction de métrique des données.
La référence à une colonne virtuelle n’est pas prise en charge.
- Supprimez une DMF dans une table :
Abandonnez la fonction de métrique des données de la table avant d’utiliser la commande DROP FUNCTION pour supprimer la fonction de métrique des données du système.
Vous pouvez utiliser la fonction DATA_METRIC_FUNCTION_REFERENCES pour identifier les objets de table et de vue pour lesquels une fonction de métrique des données est définie.
- Planification d’une DMF
Il faut dix minutes pour que la planification prenne effet une fois qu’elle a été définie.
De même, une fois que la DMF est désactivé, il faut dix minutes pour que les modifications apportées à la planification prennent effet. Pour plus d’informations, voir Planifiez l’exécution de vos DMFs.
Exemples¶
Les sections suivantes fournissent des exemples d’utilisation de la commande ALTERCOLUMN :
Renommer une table¶
Voici ce qui crée une table nommée t1
:
CREATE OR REPLACE TABLE t1(a1 number);
SHOW TABLES LIKE 't1';
+-------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------+----------------+-----------------+-------------+-------------------------+-----------------+----------+--------+
| created_on | name | database_name | schema_name | kind | comment | cluster_by | rows | bytes | owner | retention_time | change_tracking | is_external | enable_schema_evolution | owner_role_type | is_event | budget |
|-------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------+----------------+-----------------+-------------+-------------------------+-----------------+----------+--------|
| 2023-10-19 10:37:04.858 -0700 | T1 | TESTDB | MY_SCHEMA | TABLE | | | 0 | 0 | PUBLIC | 1 | OFF | N | N | ROLE | N | NULL |
+-------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------+----------------+-----------------+-------------+-------------------------+-----------------+----------+--------+
L’instruction suivante modifie le nom de la table en tt1
:
ALTER TABLE t1 RENAME TO tt1;
SHOW TABLES LIKE 'tt1';
+-------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------+----------------+-----------------+-------------+-------------------------+-----------------+----------+--------+
| created_on | name | database_name | schema_name | kind | comment | cluster_by | rows | bytes | owner | retention_time | change_tracking | is_external | enable_schema_evolution | owner_role_type | is_event | budget |
|-------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------+----------------+-----------------+-------------+-------------------------+-----------------+----------+--------|
| 2023-10-19 10:37:04.858 -0700 | TT1 | TESTDB | MY_SCHEMA | TABLE | | | 0 | 0 | PUBLIC | 1 | OFF | N | N | ROLE | N | NULL |
+-------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------+----------------+-----------------+-------------+-------------------------+-----------------+----------+--------+
Échanger des tables¶
Les instructions suivantes créent des tables nommées t1
et t2
:
CREATE OR REPLACE TABLE t1(a1 NUMBER, a2 VARCHAR, a3 DATE);
CREATE OR REPLACE TABLE t2(b1 VARCHAR);
DESC TABLE t1;
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type | kind | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| A1 | NUMBER(38,0) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL |
| A2 | VARCHAR(16777216) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL |
| A3 | DATE | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL |
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
DESC TABLE t2;
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type | kind | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| B1 | VARCHAR(16777216) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL |
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
L’instruction suivante échange la table t1
avec la table t2
:
ALTER TABLE t1 SWAP WITH t2;
DESC TABLE t1;
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type | kind | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| B1 | VARCHAR(16777216) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL |
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
DESC TABLE t2;
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type | kind | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| A1 | NUMBER(38,0) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL |
| A2 | VARCHAR(16777216) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL |
| A3 | DATE | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL |
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
Ajouter des colonnes¶
Voici ce qui crée une table nommée t1
:
CREATE OR REPLACE TABLE t1(a1 NUMBER);
DESC TABLE t1;
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type | kind | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| A1 | NUMBER(38,0) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL |
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
L’instruction suivante ajoute une colonne nommée a2
à cette table :
ALTER TABLE t1 ADD COLUMN a2 NUMBER;
L’instruction suivante ajoute une colonne nommée a3
avec une contrainte NOT NULL :
ALTER TABLE t1 ADD COLUMN a3 NUMBER NOT NULL;
L’instruction suivante ajoute une colonne nommée a4
avec une valeur par défaut et une contrainte NOT NULL :
ALTER TABLE t1 ADD COLUMN a4 NUMBER DEFAULT 0 NOT NULL;
L’instruction suivante ajoute une colonne VARCHAR nommée a5
avec une spécification de classement spécifique à la langue :
ALTER TABLE t1 ADD COLUMN a5 VARCHAR COLLATE 'en_US';
DESC TABLE t1;
+------+-----------------------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type | kind | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+-----------------------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| A1 | NUMBER(38,0) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL |
| A2 | NUMBER(38,0) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL |
| A3 | NUMBER(38,0) | COLUMN | N | NULL | N | N | NULL | NULL | NULL | NULL |
| A4 | NUMBER(38,0) | COLUMN | N | 0 | N | N | NULL | NULL | NULL | NULL |
| A5 | VARCHAR(16777216) COLLATE 'en_us' | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL |
+------+-----------------------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
L’instruction suivante utilise la clause IF NOT EXISTS pour ajouter une colonne nommée a2
uniquement si la colonne n’existe pas. Il existe une colonne existante nommée a2
. La spécification de la clause IF NOT EXISTS empêche l’instruction d’échouer avec une erreur.
ALTER TABLE t1 ADD COLUMN IF NOT EXISTS a2 NUMBER;
Comme le montre le résultat de la commande DESCRIBE TABLE, l’instruction ci-dessus n’a aucun effet sur la colonne existante nommée a2
:
DESC TABLE t1;
+------+-----------------------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type | kind | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+-----------------------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| A1 | NUMBER(38,0) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL |
| A2 | NUMBER(38,0) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL |
| A3 | NUMBER(38,0) | COLUMN | N | NULL | N | N | NULL | NULL | NULL | NULL |
| A4 | NUMBER(38,0) | COLUMN | N | 0 | N | N | NULL | NULL | NULL | NULL |
| A5 | VARCHAR(16777216) COLLATE 'en_us' | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL |
+------+-----------------------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
Renommage de colonnes¶
L’instruction suivante modifie le nom de la colonne a1
en b1
:
ALTER TABLE t1 RENAME COLUMN a1 TO b1;
DESC TABLE t1;
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type | kind | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| B1 | NUMBER(38,0) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL |
| A2 | NUMBER(38,0) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL |
| A3 | NUMBER(38,0) | COLUMN | N | NULL | N | N | NULL | NULL | NULL | NULL |
| A4 | NUMBER(38,0) | COLUMN | N | 0 | N | N | NULL | NULL | NULL | NULL |
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
Supprimer des colonnes¶
L’instruction suivante supprime la colonne a2
:
ALTER TABLE t1 DROP COLUMN a2;
DESC TABLE t1;
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type | kind | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| B1 | NUMBER(38,0) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL |
| A3 | NUMBER(38,0) | COLUMN | N | NULL | N | N | NULL | NULL | NULL | NULL |
| A4 | NUMBER(38,0) | COLUMN | N | 0 | N | N | NULL | NULL | NULL | NULL |
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
L’instruction suivante utilise la clause IF EXISTS pour supprimer une colonne nommée a2
uniquement si la colonne existe. Il n’existe aucune colonne nommée a2
. La spécification de la clause IF EXISTS empêche l’instruction d’échouer avec une erreur.
ALTER TABLE t1 DROP COLUMN IF EXISTS a2;
Comme le montre le résultat de la commande DESCRIBE TABLE, l’instruction ci-dessus n’a aucun effet sur la table existante :
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type | kind | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| B1 | NUMBER(38,0) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL |
| A3 | NUMBER(38,0) | COLUMN | N | NULL | N | N | NULL | NULL | NULL | NULL |
| A4 | NUMBER(38,0) | COLUMN | N | 0 | N | N | NULL | NULL | NULL | NULL |
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
Ajouter, renommer et supprimer des colonnes dans une table externe¶
L’instruction suivante crée une table externe nommée exttable1
:
CREATE EXTERNAL TABLE exttable1
LOCATION=@mystage/logs/
AUTO_REFRESH = true
FILE_FORMAT = (TYPE = PARQUET)
;
DESC EXTERNAL TABLE exttable1;
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+
| name | type | kind | null? | default | primary key | unique key | check | expression | comment |
|-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------|
| VALUE | VARIANT | COLUMN | Y | NULL | N | N | NULL | NULL | The value of this row |
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+
L’instruction suivante ajoute une nouvelle colonne nommée a1
à la table externe :
ALTER TABLE exttable1 ADD COLUMN a1 VARCHAR AS (value:a1::VARCHAR);
DESC EXTERNAL TABLE exttable1;
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+
| name | type | kind | null? | default | primary key | unique key | check | expression | comment |
|-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------|
| VALUE | VARIANT | COLUMN | Y | NULL | N | N | NULL | NULL | The value of this row |
| A1 | VARCHAR(16777216) | VIRTUAL | Y | NULL | N | N | NULL | TO_CHAR(GET(VALUE, 'a1')) | NULL |
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+
L’instruction suivante modifie le nom de la colonne a1
en b1
:
ALTER TABLE exttable1 RENAME COLUMN a1 TO b1;
DESC EXTERNAL TABLE exttable1;
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+
| name | type | kind | null? | default | primary key | unique key | check | expression | comment |
|-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------|
| VALUE | VARIANT | COLUMN | Y | NULL | N | N | NULL | NULL | The value of this row |
| B1 | VARCHAR(16777216) | VIRTUAL | Y | NULL | N | N | NULL | TO_CHAR(GET(VALUE, 'a1')) | NULL |
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+
L’instruction suivante supprime la colonne nommée b1
:
ALTER TABLE exttable1 DROP COLUMN b1;
DESC EXTERNAL TABLE exttable1;
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+
| name | type | kind | null? | default | primary key | unique key | check | expression | comment |
|-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------|
| VALUE | VARIANT | COLUMN | Y | NULL | N | N | NULL | NULL | The value of this row |
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+
Modifier l’ordre des clés de clustering¶
L’instruction suivante crée une table nommée t1
qui est regroupée selon les colonnes id
et date
:
CREATE OR REPLACE TABLE T1 (id NUMBER, date TIMESTAMP_NTZ, name STRING) CLUSTER BY (id, date);
SHOW TABLES LIKE 'T1';
---------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------------+----------------+
created_on | name | database_name | schema_name | kind | comment | cluster_by | rows | bytes | owner | retention_time |
---------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------------+----------------+
Tue, 21 Jun 2016 15:42:12 -0700 | T1 | TESTDB | TESTSCHEMA | TABLE | | (ID,DATE) | 0 | 0 | ACCOUNTADMIN | 1 |
---------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------------+----------------+
L’instruction suivante modifie l’ordre de la clé de clustering :
ALTER TABLE t1 CLUSTER BY (date, id);
SHOW TABLES LIKE 'T1';
---------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------------+----------------+
created_on | name | database_name | schema_name | kind | comment | cluster_by | rows | bytes | owner | retention_time |
---------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------------+----------------+
Tue, 21 Jun 2016 15:42:12 -0700 | T1 | TESTDB | TESTSCHEMA | TABLE | | (DATE,ID) | 0 | 0 | ACCOUNTADMIN | 1 |
---------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------------+----------------+
Ajouter et supprimer des politiques d’accès aux lignes¶
L’exemple suivant ajoute une politique d’accès aux lignes sur une table en spécifiant une seule colonne. Après avoir défini la politique, vous pouvez vérifier en contrôlant Information Schema.
alter table t1 add row access policy rap_t1 on (empl_id);
L’exemple suivant ajoute une politique d’accès aux lignes tout en spécifiant deux colonnes dans une seule table.
alter table t1 add row access policy rap_test2 on (cost, item);
L’exemple suivant détruit une politique d’accès aux lignes d’une table. Vérifiez que les politiques ont été détruites en interrogeant Information Schema.
alter table t1 drop row access policy rap_v1;
L’exemple suivant montre comment combiner l’ajout et la destruction de politiques d’accès aux lignes dans une seule instruction SQL pour une table. Vérifiez les résultats en contrôlant Information Schema.
alter table t1 drop row access policy rap_t1_version_1, add row access policy rap_t1_version_2 on (empl_id);
Planifier l’exécution d’une fonction de métrique des données¶
Réglez la planification de la fonction de métrique des données de sorte qu’elle s’exécute toutes les 5 minutes :
ALTER TABLE hr.tables.empl_info SET DATA_METRIC_SCHEDULE = '5 MINUTE';
Réglez la planification de la fonction de métrique des données de sorte qu’elle s’exécute tous les jours à 8:00 AM :
ALTER TABLE hr.tables.empl_info SET DATA_METRIC_SCHEDULE = 'USING CRON 0 8 * * * UTC';
Réglez la planification de la fonction de métrique des données de sorte qu’elle s’exécute à 8:00 AM les jours de la semaine uniquement :
ALTER TABLE hr.tables.empl_info SET DATA_METRIC_SCHEDULE = 'USING CRON 0 8 * * MON,TUE,WED,THU,FRI UTC';
Réglez la planification de la fonction de métrique des données de sorte qu’elle s’exécute trois fois par jour à 06:00, 12:00, et 18:00 UTC :
ALTER TABLE hr.tables.empl_info SET DATA_METRIC_SCHEDULE = 'USING CRON 0 6,12,18 * * * UTC';
Réglez la fonction de métrique des données de sorte qu’elle s’exécute lorsqu’une opération DML générale telle que l’insertion d’une nouvelle ligne modifie la table :
ALTER TABLE hr.tables.empl_info SET DATA_METRIC_SCHEDULE = 'TRIGGER_ON_CHANGES';