FirebirdSQL logo
 DOMAININDEX 

Tableaux horaires mondiaux (GTT)

Les tables temporaires globales (ci-après dénommées GTT) sont des métadonnées permanentes tout comme les tables régulières, mais les données qu’elles contiennent sont limitées dans le temps d’existence à une transaction (valeur par défaut) ou à une connexion à la base de données.Chaque transaction ou connexion possède sa propre instance de données GTT, isolée de toutes les autres.Les instances ne sont créées que si l’on accède à la GTT, et les données qu’elles contiennent sont supprimées lorsque la transaction est terminée ou déconnectée de la base de données.Les métadonnées des GTT peuvent être modifiées ou supprimées à l’aide des instructions ALTER TABLE et DROP TABLE.

Syntaxe
CREATE GLOBAL TEMPORARY TABLE name
  (<column_def> [, {<column_def> | <table_constraint>} ...])
  [ON COMMIT {DELETE | PRESERVE} ROWS]
  [SQL SECURITY {DEFINER | INVOKER}]

Si la phrase optionnelle ON COMMIT DELETE ROWS est spécifiée dans l’instruction de création de table temporaire globale, une GTT de niveau transactionnel (par défaut) sera créée. Si la phrase ON COMMIT PRESERVE ROWS est spécifiée — un niveau de connexion à la base de données GTT sera créé.

La phrase EXTERNAL [FILE] ne peut pas être utilisée pour une table temporaire globale.

Note

Les instructions COMMIT RETAINING et ROLLBACK RETAINING stockent les données dans des tables temporaires globales déclarées comme ON COMMIT DELETE ROWS.Dans Firebird 2.x il y avait un bug : COMMIT RETAINING et ROLLBACK RETAINING rendaient les enregistrements non visibles pour la transaction courante.Pour revenir au comportement de la version 2.x, définissez le ClearGTTAtRetaining à 1 dans firebird.conf.Ce paramètre peut être supprimé dans Firebird 5.0.

Restrictions GTT

Les GTT possèdent tous les attributs des tables ordinaires (clés, clés étrangères, index et déclencheurs), mais présentent un certain nombre de limitations :

  • Les tableaux GTT et réguliers ne peuvent pas se référer les uns aux autres ;

  • Les GTT de niveau connexion ("`PRESERVE ROWS'") ne peuvent pas faire référence aux GTT de niveau transaction ("`DELETE ROWS'") ;

  • Les restrictions de domaine ne peuvent pas faire référence à un GTT ;

  • La destruction d’une instance GTT à la fin de son cycle de vie ne déclenche pas de déclencheurs pré/post suppression.

Tip

Dans une base de données existante, il n’est pas toujours facile de distinguer une table ordinaire d’une TTG, ou une TTG au niveau de la transaction d’une TTG au niveau de la connexion.Utilisez la requête suivante pour identifier le type de table :

SELECT t.rdb$type_name
FROM rdb$relations r
JOIN rdb$types t ON r.rdb$relation_type = t.rdb$type
WHERE t.rdb$field_name = 'RDB$RELATION_TYPE'
  AND r.rdb$relation_name = 'TABLENAME'

Utilisez une requête pour afficher des informations sur les types de toutes les tables :

SELECT r.rdb$relation_name, t.rdb$type_name
FROM rdb$relations r
JOIN rdb$types t ON r.rdb$relation_type = t.rdb$type
WHERE t.rdb$field_name = 'RDB$RELATION_TYPE'
  AND coalesce (r.rdb$system_flag, 0) = 0

Le champ RDB$TYPE_NAME indiquera PERSISTENT pour la table régulière, VIEW pour la vue, GLOBAL_TEMPORARY_PRESERVE pour la GTT de niveau connexion et GLOBAL_TEMPORARY_DELETE pour la GTT de niveau transaction.

Exemples

Example 1. Création d’une table temporaire globale au niveau de la connexion
CREATE GLOBAL TEMPORARY TABLE MYCONNGTT (
    ID INTEGER NOT NULL PRIMARY KEY,
    TXT VARCHAR(32),
    TS TIMESTAMP DEFAULT CURRENT_TIMESTAMP)
ON COMMIT PRESERVE ROWS;
Example 2. Créez une table temporaire globale de niveau transaction qui fait référence à une table temporaire globale de niveau connexion avec une clé externe.
CREATE GLOBAL TEMPORARY TABLE MYTXGTT (
    ID INTEGER NOT NULL PRIMARY KEY,
    PARENT_ID INTEGER NOT NULL REFERENCES MYCONNGTT(ID),
    TXT VARCHAR(32),
    TS TIMESTAMP DEFAULT CURRENT_TIMESTAMP);