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
- Comment 'pomper' les données d'une base vers une autre ?
- Pourquoi lire nécessite des privilèges d'écriture sur la base de données ?
- Quel est le meilleur moyen de savoir si le serveur Firebird est actif ?
- Comment écrire des UDFs avec Delphi ?
- Comment sélectionner une ligne au hasard dans une table ?
- Comment déplacer une base de données multi-fichiers ?
- Comment migrer des fichiers Paradox, dBase ou FoxPro vers Firebird ?
- Comment empêcher le fichier firebird.log de remplir la partition du disque ?
- Comment exporter les données d'une base de données et les importer dans une autre?
- Comment extraire les métadonnées d'une base de données?
- Comment changer le dialecte d'une base de données?
- Est-il possible d'obtenir l'adresse IP du client ?
- Comment utiliser les évènements avec ZeBeDee, SSH ou stunnel?
- Comment indiquer à Firebird de n'accepter que les connexions d'un hôte XYZ ou d'un réseau ?
- Comment ouvrir une base en mode exclusif ?
- Comment obtenir une liste des tables, vues et colonnes d'une base de données Firebird ?
- Existe t-il un exemple de configuration de la valeur UdfAccess du fichier firebird.conf ?
- Y a t-il moyen d'automatiser l'exécution de SQL à partir d'une ligne de commande, d'un fichier de commandes, ou d'un script shell ?
- Existe t-il un exemple de configuration de la valeur ExternalFileAccess du fichier firebird.conf?
- Comment ré-ordonner les colonnes (champs) d'une table ?
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/
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
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/
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
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
Traduction réalisée depuis http://www.firebirdfaq.org/faq123/
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; |
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 '......' |
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; |
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/
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/
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/
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 |
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/> |
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/
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/
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/
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/
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/
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/
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/
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/
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); |
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); |
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; |
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 |
Code text : | Sélectionner tout |
UdfAccess = Restrict C:\some\directory
Code text : | Sélectionner tout |
UdfAccess = Restrict C:\some\directory;C:\some\other\directory
Code text : | Sélectionner tout |
UdfAccess = Restrict /some/directory
Traduction réalisée depuis http://www.firebirdfaq.org/faq203/
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> |
Code batch : | Sélectionner tout |
isql -i my_script.sql localhost:my_database -user sysdba -pass ******
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/
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 |
Code text : | Sélectionner tout |
ExternalFileAccess = Restrict C:\some\directory
Code text : | Sélectionner tout |
ExternalFileAccess = Restrict C:\some\directory;C:\some\other\directory
Code text : | Sélectionner tout |
ExternalFileAccess = Restrict /some/directory
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;
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/
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 çaLes 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 © 2024 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.