Précédent   Forum du club des développeurs et IT Pro > Bases de données > PostgreSQL > Extensions
Extensions Forum d'entraide sur les plugins d'extension de PostgreSQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 30/08/2010, 17h27   #1
dumbool_82
Invité de passage
 
Inscription : mars 2005
Messages : 13
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 13
Points : 1
Points : 1
Envoyer un message via MSN à dumbool_82
Par défaut Dump de base avec procédures stockées

Bonjour,
Je me suis enfin décidé à passer en version PostgreSQL 8.4 (je viens de la 7.4!) Je n'ai pas eu trop de peine malgré des petites adaptations pour mes procédures stockées en langage C (remplacement de VARATT_SIZEP par SET_VARSIZE ainsi que l'ajout du bloc "magique" PG_MODULE_MAGIC).

Mon problème est apparu lors de mon premier DUMP ou plutôt mon premier RESTORE. En effet, j'ai souvent besoin de copier des bases de données d'une machine à l'autre et j'utilise beaucoup le pg_dump.
Je retrouve bien les fonctions 'C' de ma librairie dans le fichier dump généré:
Code :
1
2
3
4
 
CREATE FUNCTION getvals(integer, integer, integer) RETURNS SETOF __vals
    AS '/usr/bin/FCTLIB/pgfuncts.so', 'getvals'
    LANGUAGE C STRICT;
Dans cette fonction, il y a un "select" dans la table "ville" de la même base de donnée. Lors de mon restore, le message d'erreur suivant apparait :
Citation:
ERROR: relation "ville" does not exist
LINE 1: select max(pkey) from ville
Et ma fonction getvals n'est pas créée! La table "ville" ne saurait pas exister puisqu'elle n'a pas encore été importée (le pg_dump crée les fonctions avant les tables). Pourtant, si je fais une fonction en plpgsql qui fait accès à une table, l'erreur n'apparaît pas et la fonction est bien créée! Je n'avais pas ce problème en version 7.4.
Quelqu'un aurait-il une explication à mon problème? Ou encore mieux, une solution? Merci!
dumbool_82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2010, 17h21   #2
dumbool_82
Invité de passage
 
Inscription : mars 2005
Messages : 13
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 13
Points : 1
Points : 1
Envoyer un message via MSN à dumbool_82
Personne n'a une idée ça m'étonne quand même que personne n'aie jamais eu ce gente de problème? C'est si peu fréquent d'utiliser des fonctions en 'C' et de faire des dump?
dumbool_82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2010, 19h37   #3
estofilo
Modérateur
 
Inscription : octobre 2008
Messages : 1 708
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 708
Points : 2 355
Points : 2 355
Il parait invraisemblable que le message d'erreur que tu cites corresponde à l'instruction SQL (CREATE FUNCTION) au-dessus.
Est-ce que c'est reproductible en-dehors de la restauration?
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2010, 09h01   #4
dumbool_82
Invité de passage
 
Inscription : mars 2005
Messages : 13
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 13
Points : 1
Points : 1
Envoyer un message via MSN à dumbool_82
Oui, évidement, j'aurais dû préciser, l'erreur ne vient pas du "restore", je voulais simplement expliquer pourquoi ma table n'existait pas encore.
Mais le message d'erreur apparait également hors restauration.

Si je fais l'instruction suivante dans une base qui n'a pas encore la table ville :

Code :
1
2
3
CREATE FUNCTION getvals(integer, integer, integer) RETURNS SETOF __vals
    AS '/usr/bin/FCTLIB/pgfuncts.so', 'getvals'
    LANGUAGE C STRICT;
Le message d'erreur est le même à savoir:
Code :
1
2
ERROR: relation "ville" does NOT exist
LINE 1: SELECT max(pkey) FROM ville
Car ma fonction getvals fait une sélection dans cette table "ville".
dumbool_82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2010, 11h54   #5
estofilo
Modérateur
 
Inscription : octobre 2008
Messages : 1 708
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 708
Points : 2 355
Points : 2 355
Citation:
Envoyé par dumbool_82 Voir le message
Car ma fonction getvals fait une sélection dans cette table "ville".
Oui mais le fait de créer une fonction ne doit pas exécuter cette fonction.
Et le CREATE FUNCTION n'est normalement pas capable, sans exécuter la fonction, de savoir qu'elle peut faire une requête sur cette table ville.

Il y a quelque chose de très curieux là-dedans.
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2010, 12h07   #6
dumbool_82
Invité de passage
 
Inscription : mars 2005
Messages : 13
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 13
Points : 1
Points : 1
Envoyer un message via MSN à dumbool_82
Exactement C'est bien là le sens de ma question... Pourquoi est-ce qu'il essaye d'accéder à ma table au moment de la création! C'est très bizarre et de nouveau, ça n'arrive qu'avec une fonction écrite en 'C'. Y aurait-il un traitement particulier dans ce cas??
dumbool_82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2010, 16h20   #7
estofilo
Modérateur
 
Inscription : octobre 2008
Messages : 1 708
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 708
Points : 2 355
Points : 2 355
Et est-ce que tu peux supprimer dans la fonction C l'appel à cette requête, juste pour tester le résultat du CREATE FUNCTION dans ce cas de figure?
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2010, 16h27   #8
dumbool_82
Invité de passage
 
Inscription : mars 2005
Messages : 13
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 13
Points : 1
Points : 1
Envoyer un message via MSN à dumbool_82
En fait ma fonction 'C' fait appel à une fonction d'initialisation qui fait différentes requêtes dans la BD. Je suppose que si je l'enlève, ça devrait créer la fonction, je vais quand même tester...
En fait, je crois surtout que le problème vient du fait que quand je charge ma librairie dynamique .so, il exécute une initialisation (je sais pas pourquoi) qui exécute les requêtes... Admettons, mais ce qui me surprend un peu, c'est que ça passe sans problème en version 7.4
Je vous tiens au courant. Merci pour votre aide en tout cas
dumbool_82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2010, 17h01   #9
estofilo
Modérateur
 
Inscription : octobre 2008
Messages : 1 708
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 708
Points : 2 355
Points : 2 355
A voir aussi s'il n'y a rien de particulier sur le type de retour __vals
de la fonction. Est-ce que c'est un type avec des fonctions d'input et d'output en C?
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2010, 19h25   #10
estofilo
Modérateur
 
Inscription : octobre 2008
Messages : 1 708
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 708
Points : 2 355
Points : 2 355
Est-ce que cette initialisation se produit dans la fonction _PG_init() ?
Cette fonction est appelée automatiquement dès le chargement du fichier .so, mais à partir de la version 8.2 seulement.
Ca expliquerait cette différence de comportement entre 7.4 et 8.4.
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/09/2010, 10h57   #11
dumbool_82
Invité de passage
 
Inscription : mars 2005
Messages : 13
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 13
Points : 1
Points : 1
Envoyer un message via MSN à dumbool_82
Bingo C'est bien une fonction qui est appelée à partir du _PG_init...
Merci pour l'info! Je vais voir comment je peux arranger ça, mais c'est évident que c'est ça le problème! Merci!
dumbool_82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 00h12.


 
 
 
 
Partenaires

Hébergement Web