|
auteur : Barbibulle |
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.
|
|
auteur : Barbibulle |
On peut créer autant de générateur qu'on en a besoin de
la manière suivante : CREATE GENERATOR GEN_MON_GENERATEUR;
|
Par défaut le générateur est initialisé à zéro mais il
est possible de modifier cette initialisation : SET GENERATOR GEN_MON_GENERATEUR TO 1000 ;
|
|
lien : Qu'est ce qu'un générateur ?
|
|
auteur : 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. 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é).
|
lien : Qu'est ce qu'un générateur ?
|
|
auteur : Barbibulle |
Pour optenir un nouveau numéro unique il faut utiliser la
fonction gen_id(NomDuGénérateur, ValeurIncrement). 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
: 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 : 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 : INSERT INTO MA_TABLE (MA_CLE_PRIMAIRE, NOM,
PRENOM) VALUES (GEN_ID(GEN_MON_GENERATEUR,1 ), ' Barbibulle ' , NULL );
|
ou bien encore : 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.
|
lien : Qu'est ce qu'un générateur ?
|
Consultez les autres F.A.Q's
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 © 2005 Developpez Developpez LLC.
Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne
peut être faite de ce site ni 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.