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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Extensions PostgreSQL Discussion :

Dump de base avec procédures stockées


Sujet :

Extensions PostgreSQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 13
    Points : 6
    Points
    6
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 13
    Points : 6
    Points
    6
    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
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 13
    Points : 6
    Points
    6
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 13
    Points : 6
    Points
    6
    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
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 13
    Points : 6
    Points
    6
    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
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    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
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 13
    Points : 6
    Points
    6
    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.

Discussions similaires

  1. [MySql] Soucis avec procédure stockée
    Par glopglopyoup dans le forum Langage SQL
    Réponses: 0
    Dernier message: 01/11/2007, 15h16
  2. Rafraîchissement d'une grille avec procédure stockée
    Par lecongolais dans le forum Bases de données
    Réponses: 1
    Dernier message: 01/02/2007, 22h38
  3. Réponses: 1
    Dernier message: 17/07/2006, 17h08
  4. C# récupérer l'id avec procédure stocké SQL Sserver 2000
    Par maximenet dans le forum Windows Forms
    Réponses: 5
    Dernier message: 10/04/2006, 23h17
  5. INSERT avec procédure stockée / Clef de type AutoInc
    Par bgdelphi dans le forum Bases de données
    Réponses: 5
    Dernier message: 18/10/2003, 18h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo