Utiliser l'historique des modifications
L'historique des modifications de BigQuery vous permet de suivre l'historique des modifications apportées à une table BigQuery. L'historique des modifications d'une table est exposé en tant que fonction de valeur de table (TVF) SQL qui indique les types de modifications particuliers effectués au cours d'une période donnée. Cette fonctionnalité vous permet de traiter les modifications incrémentielles apportées à une table. Comprendre les modifications apportées à une table peut vous aider à effectuer des opérations telles que la gestion incrémentielle d'une instance dupliquée en dehors de BigQuery tout en évitant les copies coûteuses.
Autorisations requises
Pour afficher l'historique des modifications d'une table, vous devez disposer de l'autorisation bigquery.tables.getData
sur cette table. Les rôles de gestion de l'authentification et des accès (IAM) prédéfinis suivants incluent cette autorisation:
roles/bigquery.dataViewer
roles/bigquery.dataEditor
roles/bigquery.dataOwner
roles/bigquery.admin
Si une table dispose ou a eu des règles d'accès au niveau des lignes, seul un administrateur de table peut accéder aux données historiques de la table. L'autorisation bigquery.rowAccessPolicies.overrideTimeTravelRestrictions
est requise pour la table et est incluse dans le rôle IAM roles/bigquery.admin
prédéfini.
Si une table dispose d'une sécurité au niveau des colonnes, vous ne pouvez afficher l'historique des modifications que sur les colonnes auxquelles vous avez accès.
TVF APPENDS
La TVF APPENDS
renvoie une table de toutes les lignes ajoutées à une table pour une période donnée. Les opérations suivantes ajoutent des lignes à l'historique des modifications APPENDS
:
CREATE TABLE
Instruction LDDINSERT
Instruction LMDMERGE
Instruction LMD- Charger des données dans BigQuery
- Ingestion en flux continu
Syntaxe
APPENDS( TABLE table, start_timestamp DEFAULT NULL, end_timestamp DEFAULT NULL)
table
: nom de la table BigQuery. Il ne peut pas s'agir d'une vue, d'une sous-requête, d'une table externe, d'une vue matérialisée ou d'une table générique. Cet argument doit être précédé du motTABLE
.start_timestamp
:TIMESTAMP
indiquant la première heure possible à laquelle une modification est incluse dans la sortie. Si la valeur estNULL
, toutes les modifications apportées depuis la création de la table sont renvoyées. Si la table est créée aprèsstart_timestamp
, c'est l'heure de création réelle qui est utilisée. Si la période est antérieure à la limite autorisée par la fonctionnalité temporelle, une erreur est renvoyée. Pour les tables standards, cette période est de sept jours, mais vous pouvez configurer la fenêtre temporelle pour qu'elle soit inférieure à cette valeur.end_timestamp
:TIMESTAMP
indiquant la dernière heure exclusive à laquelle une modification est incluse dans la sortie. Si la valeur estNULL
, toutes les modifications apportées jusqu'au début de la requête sont incluses.
Valeur renvoyée
La TVF APPENDS
renvoie une table avec les colonnes suivantes:
- Toutes les colonnes de la table d'entrée au moment de l'exécution de la requête. Si une colonne est ajoutée après
end_timestamp
, elle affiche des valeursNULL
renseignées dans les lignes insérées avant l'ajout de la colonne. _CHANGE_TYPE
:STRING
indiquant le type de modification ayant généré la ligne. PourAPPENDS
, la seule valeur acceptée estINSERT
._CHANGE_TIMESTAMP
:TIMESTAMP
indiquant la date et l'heure de commit de la transaction ayant effectué la modification.
Détails
Les enregistrements des lignes insérées sont conservés même si ces données sont supprimées par la suite. Les suppressions ne sont pas reflétées dans la TVF APPENDS
. Si une table est copiée, l'appel de la TVF APPENDS
sur la table copiée renvoie chaque ligne telle qu'elle a été insérée au moment de la création de la table. Si une ligne est modifiée en raison d'une opération UPDATE
, il n'y a aucun effet.
Examples
Cet exemple montre l'historique des modifications renvoyé par APPENDS
lorsque diverses modifications sont apportées à une table appelée Produce
. Cet exemple peut ne pas fonctionner si la durée de l'opération est supérieure à votre fenêtre de temps.
Commencez par créer la table.
CREATE TABLE mydataset.Produce (product STRING, inventory INT64) AS ( SELECT "apples" AS product, 10 AS inventory);
Insérez ensuite deux lignes dans la table.
INSERT INTO mydataset.Produce VALUES ("bananas", 20), ("carrots", 30);
Affichez l'historique complet des modifications des ajouts. Utilisez les valeurs NULL
pour obtenir l'historique complet dans la période temporelle.
SELECT product, inventory, _CHANGE_TYPE AS change_type, _CHANGE_TIMESTAMP AS change_time FROM APPENDS(TABLE mydataset.Produce, NULL, NULL);
Le résultat ressemble à ce qui suit :
+---------+-----------+-------------+--------------------------------+ | product | inventory | change_type | change_time | +---------+-----------+-------------+--------------------------------+ | apples | 10 | INSERT | 2022-04-15 20:06:00.488000 UTC | | bananas | 20 | INSERT | 2022-04-15 20:06:08.490000 UTC | | carrots | 30 | INSERT | 2022-04-15 20:06:08.490000 UTC | +---------+-----------+-------------+--------------------------------+
Ensuite, ajoutez une colonne, insérez une nouvelle ligne de valeurs, mettez à jour l'inventaire et supprimez la ligne "Bananes".
ALTER TABLE mydataset.Produce ADD COLUMN color STRING; INSERT INTO mydataset.Produce VALUES ("grapes", 40, "purple"); UPDATE mydataset.Produce SET inventory = inventory + 5 WHERE TRUE; DELETE mydataset.Produce WHERE product = "bananas";
Affichez la nouvelle table.
SELECT * FROM mydataset.Produce;
+---------+-----------+--------+ | product | inventory | color | +---------+-----------+--------+ | apples | 15 | NULL | | carrots | 35 | NULL | | grapes | 45 | purple | +---------+-----------+--------+
Affichez l'historique complet des modifications des ajouts.
SELECT product, inventory, color, _CHANGE_TYPE AS change_type, _CHANGE_TIMESTAMP AS change_time FROM APPENDS(TABLE mydataset.Produce, NULL, NULL);
Le résultat ressemble à ce qui suit :
+---------+-----------+--------+-------------+--------------------------------+ | product | inventory | color | change_type | change_time | +---------+-----------+--------+-------------+--------------------------------+ | apples | 10 | NULL | INSERT | 2022-04-15 20:06:00.488000 UTC | | bananas | 20 | NULL | INSERT | 2022-04-15 20:06:08.490000 UTC | | carrots | 30 | NULL | INSERT | 2022-04-15 20:06:08.490000 UTC | | grapes | 40 | purple | INSERT | 2022-04-15 20:07:45.751000 UTC | +---------+-----------+--------+-------------+--------------------------------+
La colonne inventory
affiche les valeurs qui ont été définies lorsque les lignes ont été insérées initialement dans la table. Elle n'affiche pas les modifications de l'instruction UPDATE
. La ligne contenant des informations sur les bananes est toujours présente, car la TVF APPENDS
ne capture que les ajouts aux tables, et non les suppressions.
Limites
L'historique des modifications est soumis aux limites suivantes:
- Vous pouvez uniquement afficher des informations sur les ajouts, et non sur les mises à jour ou les suppressions.
- Les données sont limitées à la période temporelle de la table.