Bonjour à tous,
Voilà un moment je ne n'étais pas venu ici, et je constate avec plaisir qu'il y a quelques connaissances plus assidues que moi 
J'ai essayé de tout mettre dans le titre et je vais décrire plus en détail le problème ci-après :
J'utilise pour sauvegarder une petite base Firebird 5 le composant Firedac FDIBBackup.
J'ai une machine serveur sur lequel est installé Firbird 5 (x32). Je remplace dans les exemples ci-après son adresse IP par "IPLocaleServeur"
- Installation toute fraiche sans modification de firebird.conf
- le super user est SYSDBA et son mot de passe masterkey
je lance ISQL :
1 2 3 4 5 6 7 8 9
| $>isql -user FRED
SQL>create database 'c:\BDD\LaBaseASauvegarder.fdb';
SQL>show database;
Database: c:\BDD\LaBaseASauvegarder.fdb
Owner : FRED
...
...
SQL>exit; |
J'édite le databases.conf pour y ajouter la ligne :
AliasDeLaBaseASauvegarder = c:\BDD\LaBaseASauvegarder.fdb
Sur un second poste du réseau j'ai une installation complète serveur en version (x64) mais je ne pense pas que ce soit le problème au besoin je testerai sur une machine qui n'a qu'une installation client seul firebird 5 (x32))
Je lance :
gbak -b -service IpLocaleServeur:service_mgr AliasDeLaBaseASauvegarder c:\BDD\LaSauvegardeGBak.fbk -USER SYSDBA -PAS masterkey
Et la sauvegarde se fait.
Je fais un petit programme dans Delphi 12
Je pose sur la fiche les trois composants :
1 2 3
| FDIBBackup1: TFDIBBackup;
FDGUIxWaitCursor1: TFDGUIxWaitCursor;
FDPhysFBDriverLink1: TFDPhysFBDriverLink; |
ainsi qu'un bouton (btSauvegarder) et six TEdit (edServeur, edAlias, edUser, edPassword, edRole, edBackup)
Sur l'évènement clic du bouton j'ai :
1 2 3 4 5 6 7 8 9 10 11 12
| with FDIBBackup1 do
begin
BackupFiles.Clear;
UserName := edUser.Text;
Password := edPassword.Text;
SqlRoleName := edRole.Text;
Protocol := ipTCPIP;
Host := edServeur.Text;
Database := edAlias.Text;
BackupFiles.Add(edBackup.Text);
Backup;
end; |
La sauvegarde fonctionne avec les valeurs des TEdit suivant :
1 2 3 4 5 6
| edServeur.Text := IpLocaleServeur;
edAlias.Text := 'AliasDeLaBaseASauvegarder';
edUser,.Text := 'SYSDBA';
edPassword.Text := 'masterkey';
edRole.Text := '';
edBackup.Text := 'c:\BDD\LaSauvegardeFDIBBackup.fbk'; |
Maintenant je retourne sur le serveur pour créer une base de sécurité spécifique à ma base de données :
1 2 3
| $>ISQL -user SYSDBA
SQL>CREATE DATABASE 'c:\BDD\MaBaseDeSecu.fdb';
SQL>exit; |
J'édite le databases.conf :
1 2 3 4
| AliasDeLaBaseASauvegarder = c:\BDD\LaBaseASauvegarder.fdb
{
SecurityDataBase = c:\BDD\MaBaseDeSecu.fdb
} |
Je vérifie que la nouvelle base de sécurité est bien prise en compte en essayant de lancer GBAK
gbak -b -service IpLocaleServeur:service_mgr AliasDeLaBaseASauvegarder c:\BDD\LaSauvegardeGBak_AvecBaseSecu.fbk -USER SYSDBA -PAS masterkey
J'ai bien un message d'erreur m'indiquant que la base de sécurité n'a pas d'utilisateur.
De retour sur le serveur, je vais créer SYSDBA et quelques autres utilisateurs ADMINDEMABASE qui aura le role rdb$admin FRED qui est le nom du Owner de la base et un utilisateur lamda a qui j'attribue le droit d'utiliser la fonction de GBAK à travers un role que je crée pour l'occasion :
1 2 3 4 5 6 7 8 9 10 11 12
| $>isql -user SYSDBA
SQL> connect AliasDeLaBaseASauvegarder;
SQL> create user SYSDBA password 'PasMasterkey';
SQL> create user ADMINDEMABASE password 'LeGrosMotDePasse';
SQL> grant rdb$admin to ADMINDEMABASE;
SQL> create user FRED password 'LeMotDePasseDeFred';
SQL> create user PECORE password 'LeMotDePasseDuPecore';
SQL> create ROLE DEMIDIEU;
SQL> Alter role DEMIDIEU set system privileges to USE_GBAK_UTILITY;
SQL> GRANT DEMIDIEU to PECORE;
SQL> commit;
SQL> exit; |
Retour sur mon poste 'client' :
Sauvegarde gbak avec SYSDBA (et le mot de passe PasMasterkey qui est celui défini pour AliasDeLaBaseASauvegarder)cela fonctionne (alors que si j'essaye avec masterkey ca ne marche pas => Normal donc).
gbak -b -service IpLocaleServeur:service_mgr AliasDeLaBaseASauvegarder c:\BDD\LaSauvegardeGBak_avecBaseSecu_SYSDBA.fbk -USER SYSDBA -PAS PasMasterkey
Sauvegarde avec ADMINDEMABASE en utilisant le role rdb$ADMIN;
gbak -b -service IpLocaleServeur:service_mgr AliasDeLaBaseASauvegarder c:\BDD\LaSauvegardeGBak_avecBaseSecu_ADMINDEMABASE.fbk -USER ADMINDEMABASE -PAS LeGrosMotDePasse -ROLE rdb$ADMIN
Sauvegarde avec FRED qui est le owner de la base AliasDeLaBaseASauvegarder
gbak -b -service IpLocaleServeur:service_mgr AliasDeLaBaseASauvegarder c:\BDD\LaSauvegardeGBak_avecBaseSecu_FRED.fbk -USER FRED -PAS LeMotDePasseDeFred
Sauvegarde avec PECORE en utilisant le role DEMIDIEU
gbak -b -service IpLocaleServeur:service_mgr AliasDeLaBaseASauvegarder c:\BDD\LaSauvegardeGBak_avecBaseSecu_PECORE.fbk -USER PECORE -PAS LeMotDePasseDuPecore -ROLE DEMIDIEU
Tout fonctionne !
Maintenant avec FDIBBackup...
Plus rien de marche
1 2 3 4 5 6
| edServeur.Text := IpLocaleServeur;
edAlias.Text := 'AliasDeLaBaseASauvegarder';
edUser,.Text := 'SYSDBA';
edPassword.Text := 'masterkey';
edRole.Text := '';
edBackup.Text := 'c:\BDD\LaSauvegardeFDIBBackup.fbk'; |
=> Your user name and password are not defined. Ask your database administrator to set up a Firebird login.
Du coup j'essaye le mot de passe du SYSDBA général :
1 2 3 4 5 6
| edServeur.Text := IpLocaleServeur;
edAlias.Text := 'AliasDeLaBaseASauvegarder';
edUser,.Text := 'SYSDBA';
edPassword.Text := 'masterkey';
edRole.Text := '';
edBackup.Text := 'c:\BDD\LaSauvegardeFDIBBackup.fbk'; |
=> Missing security context for AliasDeLaBaseASauvegarder unknown ISC error 33630835
Et tous les autres cas me renvoient "Your user name and password are not defined. Ask your database administrator to set up a Firebird login." comme si la base de sécurité de AliasDeLaBaseASauvegarder ne servait a rien.
Sous IBExpert j'ai également ce message mais si je coche Use itself as Expected database (isc_spb_expected_db) = AliasDeLaBaseASauvegarder la sauvegarde fonctionne.
D'après https://www.firebirdsql.org/file/doc...roperties.html
Pour Firebird 3.0 et versions ultérieures lors de l’utilisation d’une base de données de sécurité autre que celle par défaut, afin que Firebird sache quelle base de données utiliser pour s’authentifier. Lors de l’utilisation de la base de données de sécurité par défaut, il n’est pas nécessaire de définir cette propriété.
Certaines implémentations de services (par exemple, BackupManager) peuvent définir explicitement ceci dans le cadre de leur fonctionnement lorsque sa valeur actuelle est null.
Le problème a existé dans JAYBIRD https://github.com/FirebirdSQL/jaybird/issues/691 et a été résolu.
Quand je cherche isc_spb_expected_db dans les sources de firedac il est bien défini dans FireDAC.Phys.IBCli mais jamais utilisé.
Merci de m'avoir lu, mais je crois avoir répondu à ma question en développant mes tests et recherches...
Je laisse le message au cas où ça serve à quelqu'un (ou si j'ai loupé un truc à paramétrer)
=> Je vais mettre a jour mon Delphi peut être que ca a été corrigé, sinon tester d'autres composants ou appeler GBAK depuis mon appli.
Partager