IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo

FAQ Interbase/FirebirdConsultez toutes les FAQ

Nombre d'auteurs : 3, nombre de questions : 56, dernière mise à jour : 8 octobre 2006  Ajouter une question

 

Cette faq a été réalisée à partir des questions fréquement posées sur les forums InterBase et Firebird de et de l'expérience personnelle des auteurs.

Nous tenons à souligner que cette F.A.Q. ne garantit en aucun cas que les informations qu'elle propose soient correctes. Les auteurs font le maximum, mais l'erreur est humaine. Cette F.A.Q. ne prétend pas non plus être complète. Si vous trouvez une erreur, ou que vous souhaitez devenir rédacteur, lisez ceci

Sur ce, nous vous souhaitons une bonne lecture.
L'équipe Firebird-Interbase de Developpez.com

SommaireLes générateurs (5)
précédent sommaire suivant
 

Un générateur est un numéroteur unique. Il va donc servir principalement à créer des identifiants uniques.

Pourquoi utiliser un générateur plutôt qu'une procédure ou une table de numéros ? Et bien il faut savoir que les opérations sur les générateurs ne font pas partie de la transaction en cours. Ce qui veut dire que si on incrémente dans une transaction T1 un générateur, cette action est immédiatement visible des autres transanctions en cours ou futures. De plus l'abandon de T1 (RollBack) ne va pas altérer le générateur, il restera avec sa valeur incrémentée. Vous me direz que le numéro n'a donc pas été utilisé. Et oui il peut donc y avoir des 'trous', mais le but premier est l'unicité, ce qui est bien réalisé ici.

Mis à jour le 20 juin 2005 Barbibulle

On peut créer autant de générateur qu'on en a besoin de la manière suivante :

Code SQL : Sélectionner tout
CREATE GENERATOR GEN_MON_GENERATEUR;
Par défaut le générateur est initialisé à zéro mais il est possible de modifier cette initialisation :

Code SQL : Sélectionner tout
SET GENERATOR GEN_MON_GENERATEUR TO 1000;

Mis à jour le 20 juin 2005 Barbibulle

Pour supprimer un générateur exécutez le code ci-dessous (après vous être assuré qu'il n'est plus utilisé par les applications clientes ou par la base.

Code SQL : Sélectionner tout
1
2
delete from RDB$GENERATORS where  
RDB$GENERATOR_NAME = 'GEN_MON_GENERATEUR';
Pour renommer un générateur il faut en fait le supprimer et le recréer avec le bon nom et éventuellement l'initialiser avec la bonne valeur (celle de celui supprimé).

Mis à jour le 20 juin 2005 Barbibulle

Pour optenir un nouveau numéro unique il faut utiliser la fonction gen_id(NomDuGénérateur, ValeurIncrement).

Code SQL : Sélectionner tout
gen_id(GEN_MON_GENERATEUR,1)
On remarquera qu'on n'est pas obligé d'incrémenter de un en un, la seule règle à adopter est de ne pas utiliser un coup un incrément positif puis un coup un négatif, car évidemment dans ce cas l'unicité n'est plus garantie...

Cette fonction est utilisabe dans les procédures stockées :

Code SQL : Sélectionner tout
1
2
3
4
5
6
7
CREATE PROCEDURE SP_GEN_MON_GENERATEUR 
RETURNS (ID INTEGER) 
AS 
BEGIN 
  ID = GEN_ID(GEN_MON_GENERATEUR, 1); 
  SUSPEND; 
END
Bien entendu dans les triggers :

Code SQL : Sélectionner tout
1
2
3
4
5
6
7
8
CREATE TRIGGER MON_TRIGGER_BI FOR MA_TABLE 
ACTIVE BEFORE INSERT POSITION 0 
AS 
  
BEGIN 
  IF (NEW.MA_CLE_PRIMAIRE IS NULL) THEN 
    NEW.MA_CLE_PRIMAIRE = GEN_ID(GEN_MON_GENERATEUR,1); 
END
mais également dans les ordres SQL :

Code SQL : Sélectionner tout
1
2
INSERT INTO MA_TABLE (MA_CLE_PRIMAIRE, NOM,  
PRENOM) VALUES (GEN_ID(GEN_MON_GENERATEUR,1), 'Barbibulle', NULL);
ou bien encore :

Code SQL : Sélectionner tout
1
2
SELECT GEN_ID(GEN_MON_GENERATEUR,1) FROM  
RDB$DATABASE;
Cette dernière méthode permet de récupérer la valeur incrémentée du générateur sans utiliser une procédure stockée.

Mis à jour le 20 juin 2005 Barbibulle

Pour lire un générateur sans l'affecter il suffit de faire :

Code SQL : Sélectionner tout
gen_id(GEN_MON_GENERATEUR,0)

Mis à jour le 20 juin 2005 Barbibulle

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2021 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.