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

FAQ FirebirdConsultez toutes les FAQ

Nombre d'auteurs : 6, nombre de questions : 205, dernière mise à jour : 15 septembre 2014  Ajouter une question

 

Cette faq a été réalisée à partir des questions fréquement posées sur les forums Firebird de http://www.developpez.com 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 de Developpez.com

SommaireComment faire ? (20)
précédent sommaire suivant
 

Beaucoup recommandent IB Pump ou IB Data Pump, le problème est quand vous avez des relations complexes entre tables.
Dans de tel cas, il est préférable d'utiliser un outil comme FBCopy qui tri les tables selon leurs dépendances (clés étrangères, contraintes d'intégrité)
http://www.firebirdfaq.org/fbcopy.php

Comme autre alternative, vous pouvez désactiver les contraintes durant l'import puis les remettre plus tard.

Si vous voulez importer des données à partir de sources non-Firebird, alors IB DataPump est probablement la meilleure option gratuite disponible.
Il est même capable de récréer la structure d'une base de données Firebird abimée, donc vous pouvez l'utiliser comme outil de migration pour migrer à partir d'autres systèmes DBMS.

Il existe d'autres outils génériques (non spécifique à Firebird) pour pomper les données, faites au moins un essai avec
http://scriptella.javaforge.com

Si vous connaissez d'autres outils gratuits et utiles pour copier les données faites le nous savoir, merci.
traduction réalisée depuis http://www.firebirdfaq.org/faq20/

Mis à jour le 10 mars 2009 SergioMaster

Pour exécuter une instruction SELECT, il est quand même nécessaire de démarrer une transaction.

Si vous voulez une base en lecture seule pour la mettre sur un média en lecture seule comme un CD ou DVD ROM, vous pouvez le faire avec :

Code batch : Sélectionner tout
gfix -mode read_only database.fdb
... ou avec votre outil d'administration favori.
C'est également possible via les API Services, de façon à ce que vous puissiez le faire à partir de votre application.
Prenez note que vous ne pouvez faire ce changement qu'au cours de la préparation de la base de données, car l'indicateur de lecture seule doit être écrit dans le fichier base de données.

Quand la base de données est en lecture seule, la seule chose modifiable est l'indicateur lecture seule lui-même (pour remettre la base en lecture/écriture).
Traduction réalisée depuis http://www.firebirdfaq.org/faq164/

Mis à jour le 10 mars 2009 SergioMaster

Si vous voulez le faire à partir d'une application, un simple essai de connexion devrait suffire. Autrement vous avez différentes options:

  • Vérifiez que le serveur Firebird est dans la liste des programmes en cours d'exécution (utilisez le gestionnaire de tâches de Windows, ou la commande 'ps ax' sous Linux). Notez que le mode Classic ne s'exécutera pas sans une connexion établie.
  • Vérifiez que le port 3050 est ouvert sur la machine. Premièrement, vous pouvez le vérifier avec la commande netstat, et, s'il est ouvert, vous pouvez vérifier qu'il accepte des connexions via telnet-ing vers le port. tapez : telnet [hostname|IPaddress] 3050 Exemple:
    Code batch : Sélectionner tout
    telnet localhost 3050
    Si vous utilisez Linux, vous pouvez également vérifier l'ouverture du port avec la commande 'lsof'. Comme cette commande sort beaucoup d'informations, vous la diminuerez en utilisant 'grep' sur les chaines '3050' ou 'gds_db' :
    Code batch : Sélectionner tout
    # lsof | grep gds_db # lsof | grep 3050
  • Si tout ceci échoue, peut-être devriez vous vérifier que le serveur distant est joignable pour tous. Utilisez la commande 'ping' : ping [hostname|IPaddress] Exemple:
    Code batch : Sélectionner tout
    ping 192.168.0.22
    Prenez note que ping peut quand même vous fournir un message 'Hôte non joignable' même s'il l'est en réalité. Cela peut être dû au pare-feu qui refuse les paquets ICMP (ping) (ceci pour empêcher certains virus de se répandre ou un scan du réseau).

Traduction réalisée depuis http://www.firebirdfaq.org/faq123/

Mis à jour le 10 mars 2009 SergioMaster

C'est relativement simple, la seule chose dont vous devez vous rappeler est que vous devez toujours utiliser ib_util_malloc() pour allouer de la mémoire si votre UDF doit renvoyer une valeur Chaîne.
L'UDF doit être alors déclarée comme FREE_IT, de façon à ce que Firebird libère la mémoire après avoir lu la chaîne.

Pour utiliser ib_util_malloc(), vous devez importer celle-ci depuis ib_util.dll dans votre programme - et vous assurez que vous l'utilisez en lieu et place des fonctions normales d'allocation mémoire.
Voici un exemple simple d'UDF Delphi :

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
function ib_util_malloc(l: integer): pointer; cdecl; external 'ib_util.dll'; 
  
function ChangeMyString(const p: PChar): PChar; cdecl; 
var 
s: string; 
begin 
s := DoSomething(string(p)); 
Result := ib_util_malloc(Length(s) + 1); 
StrPCopy(Result, s); 
end;
Déclaration dans Firebird:

Code sql : Sélectionner tout
1
2
3
4
DECLARE EXTERNAL FUNCTION ChangeMyString 
CString(255) 
RETURNS CString(255) FREE_IT 
ENTRY_POINT 'ChangeMyString' MODULE_NAME '......'
Traduction réalisée depuis http://www.firebirdfaq.org/faq83/

Mis à jour le 10 mars 2009 SergioMaster

Il n'existe pas de telle implémentation dans Firebird, mais vous pouvez utiliser quelques astuces.
L'exemple suivant requière une colonne unique de type entier (en général une clé primaire):

Code sql : Sélectionner tout
1
2
3
4
SELECT ...liste des champs ... 
FROM table t1 
WHERE conditions 
ORDER BY (t1.int_col + seed)*4294967291-((t1.int_col + seed)*4294967291/49157)*49157;
Si vous n'avez besoin que d'une ligne, limitez le résultat en utilisant les clauses FIRST ou ROWS.
Cette requête vous donnera toujours le même résultat pour la même valeur de la variable seed, pour un résultat différent vous devrez changer sa valeur.
Vous pourriez par exemple utiliser la valeur de int_col de la dernière exécution, ou récupérer une nouvelle valeur d'un générateur etc...
(assurez vous simplement de bien modifier la valeur de seed dans les deux endroits de l'expression).
Traduction réalisée depuis http://www.firebirdfaq.org/faq326/

Mis à jour le 10 mars 2009 SergioMaster

Vous avez probablement l'habitude d'utiliser une base de données mono-fichier que vous pouvez déplacer comme bon vous semble.
Mais, si votre base de données est devenue trop grosse vous pourriez avoir besoin d'en faire une multi-fichiers.
Les chemins vers les fichiers secondaires sont absolus et stockés dans la page d'entête du premier fichier de la base.
Si vous avez besoin de déplacer ces fichiers, il est recommandé de faire un backup de la base suivi d'un restaure au nouvel endroit.
Cependant, si vous avez vraiment, vraiment besoin de les copier ailleurs, vous pouvez utiliser l'outil freeware GLink d'Ivan Prenosil:
http://www.volny.cz/iprenosil/interb...b_download.htm

Traduction réalisée depuis http://www.firebirdfaq.org/faq179/

Mis à jour le 10 mars 2009 SergioMaster

Le meilleur moyen est de télécharger le freeware IBDataPump de CleverComponents.
Il extraira les méta-données des bases Paradox/dBase/FoxPro, créera toutes les tables dans une base de données Firebird puis copiera toutes les données.
Vous aurez probablement une base Firebird opérationnelle en moins d'une heure.
http://www.clevercomponents.com/prod...ibdatapump.asp

Traduction réalisée depuis http://www.firebirdfaq.org/faq156/

Mis à jour le 10 mars 2009 SergioMaster

Quelques astuces :

  • Créez une tache planifiée (ou cron) qui coupera ou fera tourner le fichier log. Par exemple, nous voulons traiter les fichiers de telle manière que nous ayons toujours un certain nombre de fichiers traces disponibles :

Code batch : Sélectionner tout
1
2
3
4
5
6
delete firebird.log.5 
rename firebird.log.4 firebird.log.5 
rename firebird.log.3 firebird.log.4 
rename firebird.log.2 firebird.log.3 
rename firebird.log.1 firebird.log.2 
rename firebird.log firebird.log.1
De cette manière nous aurons toujours les 5 derniers fichiers traces, et ceux trop vieux auront été effacés.
Vous pouvez aussi utiliser zip, rar, bzip2 ou autre mode de compression pour compacter les vieux fichiers. Comme ce n'est que du texte, ils se compressent très bien.

  • Redirigez les traces vers le vide. Par exemple, sous Linux, vous pouvez le faire en créant un lien symbolique vers /dev/null au lieu du fichier normal de log :


Code batch : Sélectionner tout
1
2
3
# cd /opt/firebird<br/> 
# rm -f firebird.log<br/> 
# ln -s /dev/null firebird.log<br/>
Prenez note que si vous faites cela , vous n'aurez plus aucune information pour établir un diagnostic.
Il est toujours préférable d'essayer de trouver quelles sont les erreurs, ce qui les cause et de régler le problème à la source.
Traduction réalisée depuis http://www.firebirdfaq.org/faq126/

Mis à jour le 10 mars 2009 SergioMaster

Si vos bases de données sont 'en-ligne', c'est-à-dire accessibles par le réseau, alors vous pouvez utiliser un outil gratuit tel que IB Pump ou un des outils commerciaux qui intègrent cette fonctionnalité. Sous Linux vous pouvez utiliser l'outil Open Source FBCopy:

http://www.firebirdfaq.org/fbcopy.php

Dans le cas contraire, vous devrez exporter puis réimporter vos données. La plupart des outils d'administration permettent d'exporter au format CSV, XML ou sous forme d'instructions INSERT. Vous pouvez également utiliser l'outil Open Source FBExport (disponible sous Windows et Linux) qui gèrent parfaitement les champs BLOB notamment.

http://www.firebirdfaq.org/fbexport.php

Traduction réalisée depuis http://www.firebirdfaq.org/faq86/

Mis à jour le 10 mars 2009 Cl@udius

C'est relativement simple, utiliser isql avec l'option -x ou -a. Cependant soyez prudent et effectuez tout d'abord quelques tests. Certains outils commerciaux tiers aiment bien jouer directement avec les tables systèmes, et isql n'est pas toujours capable de comprendre ce type de manipulations.

Vous pouvez également extraire les DDL avec FlameRobin. Ouvrez la page des propriétés de la base de données et sélectionnez l'option DDL en haut de la page.

Traduction réalisée depuis http://www.firebirdfaq.org/faq73/

Mis à jour le 10 mars 2009 Cl@udius

Bien qu'il soit possible de changer cet indicateur dans la base de données, ce n'est pas recommandé car cela ne se résume pas uniquement à cette simple opération. Les dialectes opèrent de manières différentes sur les données numériques et dates, ce qui affecte tous les objets compilés (BLR) soit les procédures stockées, déclencheurs, champs calculés, etc.
Modifier toutes ces informations à la volée est une méthode délicate, il est donc recommandé de créer une nouvelle base et d'y recopier les données. Vous pouvez facilement extraire la structure de la base de données en utilisant isql puis y ajouter les données en utilisant l'un des outils listés par ailleurs dans la FAQ.

Il n'est pas possible de modifier le dialecte en effectuant un backup/restore de la base de données.

Traduction réalisée depuis http://www.firebirdfaq.org/faq186/

Mis à jour le 1er mai 2009 Cl@udius

Pour l'obtenir avec SQL, vous devrez utiliser Firebird 2.0 (propre adresse), ou Firebird 2.1 (adresse de n'importe qui):

Si vous utilisez Firebird 2.0 ou plus, sollicitez la fonction GET_RDB$CONTEXT avec les paramètres ('SYSTEM', 'CLIENT_ADDRESS').

A partir de Firebird 2.1 , vous pourrez obtenir les adresses des clients en les sélectionnant dans les tables de monitoring.

Avec Firebird 1.x vous pouvez essayer d'obtenir cette information de la pile TCP/IP, en utilisant les commandes netstat ou lsof à partir de l'invite de commande.
Recherchez le port de Firebird (3050 ou gds_db).

Traduction réalisée depuis http://www.firebirdfaq.org/faq101/

Mis à jour le 1er mai 2009 SergioMaster

Réponse courte : Vous devez pour cela utiliser le mode SuperServeur, renseignez la valeur RemoteAuxPort du fichier firebird.conf et créez deux tunnels (un pour les données, l'autre pour les évènements).

Pour des explications détaillées avec exemples, lisez ce document :
http://www.flamerobin.org/events_paper.pdf

Traduction réalisée depuis http://www.firebirdfaq.org/faq258/

Mis à jour le 1er mai 2009 SergioMaster

Ce n'est pas vraiment une chose à configurer dans Firebird.
Il existe une valeur RemoteBindAddress dans le fichier firebird.conf qui configure les interfaces/adresses que Firebird écoute, c'est tout.
Vous utiliserez plutôt le pare-feu de votre système pour mettre cela en place.

A coté du pare-feu, si vous utilisez la version Firebird mode Classic sous Linux, vous pourrez utiliser les fichiers de contrôle d'accès de xinetd ouinetd /etc/hosts.allow et /etc/hosts.deny.
Avec xinetd vous pouvez également modifier le fichier de configuration /etc/xinetd.d/firebird pour le service Firebird, et ajouter une ligne comme celle-ci :

Code text : Sélectionner tout
only_from = 192.168.0.0/24

Traduction réalisée depuis http://www.firebirdfaq.org/faq148/

Mis à jour le 1er mai 2009 SergioMaster

Vous devez fermer la base (en utilisant gfix ou un autre outil).
Firebird 2.0 offre divers mode de fermeture (mono-utilisateur, connexion unique, connexion multiple, etc.).
Jetez un ?il au notes de versions de Firebird 2 pour les détails.
Traduction réalisée depuis http://www.firebirdfaq.org/faq131/

Mis à jour le 1er mai 2009 SergioMaster

Tables et vues sont stockées dans la table système RDB$RELATIONS.
les tables et vues systèmes ont un indicateur RDB$SYSTEM_FLAG, tandis que les tables utilisateur ont la valeur NULL ou 0.
Vous pouvez distinguer les vues des tables par la valeur du champ RDB$VIEW_BLR.
Prenez note qu'il y a aussi un champ RDB$VIEW_SOURCE qui stocke un source lisible de la vue pouvant être mis à NULL - la base de données continuera à être pleinement fonctionnelle car utilisant le BLR pré-compilé.
Voici une requête listant toutes les tables utilisateur :

Code sql : Sélectionner tout
1
2
3
4
SELECT RDB$RELATION_NAME 
FROM RDB$RELATIONS 
WHERE RDB$VIEW_BLR IS NULL 
AND (RDB$SYSTEM_FLAG IS NULL OR RDB$SYSTEM_FLAG = 0);
Une requête pour lister toutes les vues

Code sql : Sélectionner tout
1
2
3
4
SELECT RDB$RELATION_NAME 
FROM RDB$RELATIONS 
WHERE RDB$VIEW_BLR IS NOT NULL 
AND (RDB$SYSTEM_FLAG IS NULL OR RDB$SYSTEM_FLAG = 0);
Les colonnes des tables et vues sont stockées dans RDB$RELATION_FIELDS.
Cela stocke le nom, la valeur par défaut, le domaine et l'indicateur de nullité (nullifiable).
Pour obtenir le type de données vous devrez lires les informations de domaine contenues dans RDB$FIELDS.
Voici une requête qui liste toutes les tables utilisateurs avec leurs colonnes

Code sql : Sélectionner tout
1
2
3
4
5
6
SELECT f.RDB$RELATION_NAME, f.RDB$FIELD_NAME 
FROM RDB$RELATION_FIELDS f 
JOIN RDB$RELATIONS r ON f.RDB$RELATION_NAME = r.RDB$RELATION_NAME 
AND r.RDB$VIEW_BLR IS NULL 
AND (r.RDB$SYSTEM_FLAG IS NULL OR r.RDB$SYSTEM_FLAG = 0) 
ORDER BY 1, f.RDB$FIELD_POSITION;
Traduction réalisée depuis http://www.firebirdfaq.org/faq174/

Mis à jour le 1er mai 2009 SergioMaster

Il en existe déjà un dans le fichier firebird.conf, mais peut-être n'est-il pas assez évident.
Voici les valeurs de base ,'None' pour interdire complètement les UDFs et 'Full' pour les permettre partout (ce que vous avez probablement compris de vous même) :

Code text : Sélectionner tout
1
2
UdfAccess = None 
UdfAccess = Full
Voici un moyen de réduire :

Code text : Sélectionner tout
UdfAccess = Restrict C:\some\directory
Pour plusieurs répertoires , vous faites ainsi

Code text : Sélectionner tout
UdfAccess = Restrict C:\some\directory;C:\some\other\directory
Pour les utilisateurs Linux

Code text : Sélectionner tout
UdfAccess = Restrict /some/directory
La valeur par défaut est 'Restrict UDF', 'UDF' où UDF est le répertoire lié au répertoire principal de l'installation Firebird.
Traduction réalisée depuis http://www.firebirdfaq.org/faq203/

Mis à jour le 20 juin 2009 SergioMaster

Oui. Vous pouvez utiliser ISQL pour cela. Il se trouve dans le répertoire 'bin' de votre installation Firebird.
Si vous voulez l'essayer de manière interactive (mode console) , exécuter isql, tapez :

Code batch : Sélectionner tout
1
2
3
4
isql localhost:my_database -user sysdba -pass ****** 
SQL> input my_script.sql; 
SQL> commit; 
SQL>
Pour l'exécuter dans un fichier de commandes (.bat) ou un script shell, utiliser l'option -i :

Code batch : Sélectionner tout
isql -i my_script.sql localhost:my_database -user sysdba -pass ******
Si vous avez des instructions DML dans votre script, n'oubliez pas la commande COMMIT à la fin du fichier.
Assurez vous également que le fichier se termine par le caractère nouvelle ligne (LF), car ISQL exécute la commande de la ligne après avoir lu ce caractère.

Traduction réalisée depuis http://www.firebirdfaq.org/faq124/

Mis à jour le 12 juin 2009 SergioMaster

Le fichier de configuration Firebird (firebird.conf) contient des descriptions qui expliquent tout, mais quelques fois elles sont confuses et il est difficile de comprendre que faire exactement si vous n'avez pas d'exemple.
L'une de ces valeurs c'est ExternalFileAccess. Beaucoup de personnes ont tenté de mettre 'Full' car plus facile que d'essayer de deviner le bon format.
Voici les valeurs de base ('None' pour interdire les tables externes et 'Full' pour les permettre partout) ce que vous avez probablement compris de vous même :

Code text : Sélectionner tout
1
2
ExternalFileAccess = None 
ExternalFileAccess = Full
Et voici ces valeurs 'astucieuses' :

Code text : Sélectionner tout
ExternalFileAccess = Restrict C:\some\directory
Pour plusieurs répertoires, utilisez quelque chose comme :

Code text : Sélectionner tout
ExternalFileAccess = Restrict C:\some\directory;C:\some\other\directory
Pour les utilisateurs Linux :

Code text : Sélectionner tout
ExternalFileAccess = Restrict /some/directory
Traduction réalisée depuis http://www.firebirdfaq.org/faq195/

Mis à jour le 20 juin 2009 SergioMaster

Bien que l'ordre importe peu aux applications (vous pouvez toujours faire des requêtes explicites avec l'ordre souhaité), cela sera, peut-être, plus facile pour vous quand vous travaillerez sur les tables avec un outil d'administration de base de données.
Vous pouvez déplacer une colonne vers une position différente en utilisant l'instruction SQL suivante :

Code sql : Sélectionner tout
ALTER TABLE nom_table ALTER nom_champ POSITION nouvelle_position;
Les positions sont numérotées à partir de un. Si vous voulez permuter deux champs, assurez-vous de faire l'instruction pour les deux.
Un outil comme Flamerobin vous permet de faire cela facilement (option 'Reorder Fields' dans l'écran propriétés de table).

Traduction réalisée depuis http://www.firebirdfaq.org/faq185/

Mis à jour le 20 juin 2009 SergioMaster

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 © 2022 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.