Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 11 sur 11
  1. #1
    Invité de passage
    Inscrit en
    mars 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 13
    Points : 1
    Points
    1

    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 :
    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!

  2. #2
    Invité de passage
    Inscrit en
    mars 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 13
    Points : 1
    Points
    1

    Par défaut

    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?

  3. #3
    Expert Confirmé
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 822
    Points : 2 514
    Points
    2 514

    Par défaut

    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?

  4. #4
    Invité de passage
    Inscrit en
    mars 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 13
    Points : 1
    Points
    1

    Par défaut

    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".

  5. #5
    Expert Confirmé
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 822
    Points : 2 514
    Points
    2 514

    Par défaut

    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.

  6. #6
    Invité de passage
    Inscrit en
    mars 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 13
    Points : 1
    Points
    1

    Par défaut

    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??

  7. #7
    Expert Confirmé
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 822
    Points : 2 514
    Points
    2 514

    Par défaut

    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?

  8. #8
    Invité de passage
    Inscrit en
    mars 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 13
    Points : 1
    Points
    1

    Par défaut

    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

  9. #9
    Expert Confirmé
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 822
    Points : 2 514
    Points
    2 514

    Par défaut

    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?

  10. #10
    Expert Confirmé
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 822
    Points : 2 514
    Points
    2 514

    Par défaut

    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.

  11. #11
    Invité de passage
    Inscrit en
    mars 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 13
    Points : 1
    Points
    1

    Par défaut

    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!

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •