Vous n'êtes pas identifié(e).

#1 Re : PgAdmin3 » installation en mode client seul » 30/10/2012 01:08:59

finalement j'ai trouvé la solution, il fallait encore installer le contenu de /src/bin/pg_config

donc, au cas où ça intéresse quelqu'un, pour installer pgAdmin3 1.16 à partir des sources sur une machine sans base PostgreSQL, il faut installer les "morceaux" suivants de PostgreSQL
- libpq (/src/interfaces/libpq/make install)
- les headers (/src/include/make install)
- et pg_config (/src/bin/pg_config/make install)



...et pgAdmin s'installe nickel !!

#2 PgAdmin3 » installation en mode client seul » 29/10/2012 19:20:01

bebert73
Réponses : 2

Bonjour,-

J'essaye d'installer pgAdmin 1.16 depuis les sources, sur un poste Debian Squeeze sur lequel PostgreSQL n'est pas installé

J'ai le message suivant : Could not find your PostgreSQL installation

A noter que psql est installé sur mon poste client, et parfaitement fonctionnel (par conséquent libpq est installé aussi)

En plus de libpq et psql, j'ai aussi installé les headers (qu'on trouve dans /src/include/ après décompression de postgreSQL) après avoir lu ce post de gleu, mais rien n'y fait, même si je lui indique le chemin d'installation des librairies (chemin par défaut de postgresql9.2, soit /usr/local/pgsql)

Comment faire pour installer pgAdmin3 en mode client seul ?

#3 Re : PgAdmin3 » désactiver l'autocommit » 30/10/2011 14:44:28

Juste un petit complément

J'ai testé différentes interfaces graphiques avec PostrgreSQL (version 9.1 sous Linux)

A ma connaissance, la seule dans laquelle on peut désactiver l'autocommit (sans avoir à démarrer explicitement une transaction avec BEGIN comme expliqué par gleu ci-dessus) est RazorSQL.

Sinon j'ai aussi testé Tora, là aussi c'est officiellement implémenté, mais çà ne marche pas.

RazorSQL et Tora sont des outils multi-bases (donc qui supportent d'autres bases que PostgreSQL, telles que Oracle, MySQL, etc.). Tora est sous Linux, RazorSQL sous Linux, MacOS ou Windows.

Tora est opensource, RazorSQL propriétaire et payant (69$). RazorSQL me semble vraiment être au-dessus du lot, je trouve que ça vaut les 69$. L'éditeur SQL est notamment bien plus fourni que celui de PGAdminIII ou de Tora, avec des petites astuces bien sympathiques (autocomplétion avec le nom des tables, ce qui évite bien des fautes de frappes, etc...)

#4 Re : Installation » probleme pl/perl pour PostgreSQL 9.1 sous Ubuntu 10.04 LTS » 30/10/2011 01:24:51

Ca se confirme, à mon avis PL/PERL ne peut pas être installé avec PostgreSQL 9.1 sous Ubuntu 10.04

Je suis tombé sur ça :
http://packages.ubuntu.com/fr/oneiric/p … plperl-9.1

PL/PERL 9.1 nécessite la version 5.12.4 minimum de perl.

Or Ubuntu 10.04 ne possède que la version 5.10, et impossible via les dépôts d'installer une version supérieure. J'ai bien essayé de l'installer manuellement, mais perl 5.12 exige au préalable qu'on désinstalle perl 5.10, or avec toutes les dépendances la désinstallation est une usine à gaz.

Bref, je vais tout simplement installer la toute dernière version d'Ubuntu pour utiliser PG 9.1.

#5 Re : Installation » probleme pl/perl pour PostgreSQL 9.1 sous Ubuntu 10.04 LTS » 29/10/2011 17:52:45

non non non, "plperl.so" est bien installé... Je le vois bien dans "/opt/PostgreSQL/9.1/lib/postgresql".

et il y a vraiment très peu d'options lors de l'installation graphique de PostgreSQL, et j'ai tout laissé par défaut. D'ailleurs ça ne parle jamais de perl dans l'installation.

reprenez ce que j'ai écrit dans mon tout premier post :

bebert73 a écrit :

Quand je fais "create language plperl;" :

1°/ Dans un premier temps, il me met le message d'erreur "ERROR:  could not load library "/opt/PostgreSQL/9.1/lib/postgresql/plperl.so": libperl.so: Ne peut ouvrir le fichier d'objet partagé: Aucun fichier ou dossier de ce type"
Je me suis rendu compte que dans /usr/lib je n'ai en effet aucun fichier qui s'appelle "libperl.so", j'ai un fichier "libperl.so.5.10.1" et un lien symbolique sur ce fichier, nommé "liberl.so.5.10".
J'ai donc créé un deuxième lien symbolique sur ce fichier "libperl.so.5.10.1", lien que j'ai appelé "libperl.so".

2°/ Après avoir fait ça, il me met un message d'erreur différent : "ERROR:  could not load library "/opt/PostgreSQL/9.1/lib/postgresql/plperl.so": /opt/PostgreSQL/9.1/lib/postgresql/plperl.so: undefined symbol: Perl_sv_2bool_flags"

On voit bien au premier message qu'il n'arrive pas à charger "plperl.so" car il lui manque "libperl.so".
Et quand par la suite je crée un lien symbolique "libperl.so" sur le fichier "libperl.so.5.10.1", le message change, cette fois il ne se plaint plus de ne pas trouver "libperl.so", mais il n'arrive pas à charger "plperl.so" (qu'il trouve bien cependant)


A noter que par curiosité j'ai fait un "sudo find / -name libperl.so" sur ma machine Ubuntu 10.04 avec PostgreSQL 8.4 (donc l'installation pour laquelle je n'ai pas eu de problème pour créer le langage plperl) : il ne me trouve aucun fichier "libperl.so", il a juste "plperl.so" et le "libperl.so.5.10.1" installé par Ubuntu.


Ma déduction logique serait de dire que le plperl de PostgreSQL 9.1 est incompatible avec le Ubuntu 10.04... c'est surprenant quand même

#6 Re : Installation » probleme pl/perl pour PostgreSQL 9.1 sous Ubuntu 10.04 LTS » 29/10/2011 16:53:13

gleu a écrit :

Non, ça, c'est le langage plperl distribut par PostgreSQL.

Ah non ! Le fichier "libperl.so.5.10.1" n'a pas été installé par PostgreSQL, il était déjà présent avant l'installation de PostgreSQL (je travaille dans des machines virtuelles et je fais des snapshots au fur et à mesure des installation, ce qui me permet facilement de revenir en arrière pour vérifier ce genre de points). Donc je viens de vérifier, "libperl.so.5.10.1" est installé d'origine dans Ubuntu, ce n'est pas installé par PostgresSQL.

gleu a écrit :

Mais vous devez aussi avoir l'interpréteur perl installé sur le serveur (ce qui devrait être fait par défaut). Donc quelle est la version de l'interpréteur perl installé survotre machine ?

Je ne sais pas, y-a-t-il une commande pour voir ça ? Comme dit, vu la version de libperl qui est installée, j'en déduis que c'est perl 5.10.1 que j'ai.


Une dernière remarque : en partant de la même machine, si au lieu d'installer PostgreSQL 9.1 j'installe la version 8.4 (via les dépôts synaptics), tout marche bien, je peux faire un "create language plperl;" sans aucun problème. Ce n'est que dans la version 9.1 que j'ai ce problème.

#7 Re : Installation » probleme pl/perl pour PostgreSQL 9.1 sous Ubuntu 10.04 LTS » 29/10/2011 12:06:38

Le fichier libperl qui est installé est le libperl.so.5.10.1

J'en déduis donc que c'est la version 5.10.1 de Perl qui est installée, non ?

J'ai installé Ubuntu 10.04LTS, j'ai téléchargé toutes ses mises à jour, puis j'ai installé PostgreSQL 9.1 (via l'installateur d'Enterprise DB). C'est tout.

#8 Re : Installation » probleme pl/perl pour PostgreSQL 9.1 sous Ubuntu 10.04 LTS » 29/10/2011 10:48:46

Dans le premier cas de figure (donc avant que ne je crée un lien symbolique "libperl.so" sur le fichier "libperl.so.5.10.1") la commande "ldd /opt/PostgreSQL/9.1/lib/postgresql/plperl.so" me donne :
linux-gate.so.1 =>  (0x003eb000)
libperl.so => not found
libnsl.so.1 => /lib/tls/i686/cmov/libnsl.so.1 (0x00a5f000)
libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0x00c8f000)
libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x00ae4000)
libcrypt.so.1 => /lib/tls/i686/cmov/libcrypt.so.1 (0x00dbd000)
libutil.so.1 => /lib/tls/i686/cmov/libutil.so.1 (0x00e10000)
libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0x008aa000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00110000)
/lib/ld-linux.so.2 (0x00e64000)


Dans un second temps (donc après avoir créé ce lien symbolique), la commande "ldd /opt/PostgreSQL/9.1/lib/postgresql/plperl.so" me donne :
linux-gate.so.1 =>  (0x005c2000)
libperl.so => /usr/lib/libperl.so (0x00110000)
libnsl.so.1 => /lib/tls/i686/cmov/libnsl.so.1 (0x0025d000)
libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0x00e2d000)
libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x009f0000)
libcrypt.so.1 => /lib/tls/i686/cmov/libcrypt.so.1 (0x004ae000)
libutil.so.1 => /lib/tls/i686/cmov/libutil.so.1 (0x005e4000)
libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0x007c8000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00ca6000)
/lib/ld-linux.so.2 (0x002a8000)

#9 Installation » probleme pl/perl pour PostgreSQL 9.1 sous Ubuntu 10.04 LTS » 28/10/2011 22:32:49

bebert73
Réponses : 9

Bonjour,

Quand on installe PostgreSQL via aptitude dans Ubuntu 10.04 LTS, il installe la version 8.4.

J'ai donc installé la version 9.1, via l'installateur graphique fourni par Enterprise DB.

Tout fonctionne bien, à l'exception du langage pl/perl, que je n'arrive pas à installer.

Quand je fais "create language plperl;" :

1°/ Dans un premier temps, il me met le message d'erreur "ERROR:  could not load library "/opt/PostgreSQL/9.1/lib/postgresql/plperl.so": libperl.so: Ne peut ouvrir le fichier d'objet partagé: Aucun fichier ou dossier de ce type"
Je me suis rendu compte que dans /usr/lib je n'ai en effet aucun fichier qui s'appelle "libperl.so", j'ai un fichier "libperl.so.5.10.1" et un lien symbolique sur ce fichier, nommé "liberl.so.5.10".
J'ai donc créé un deuxième lien symbolique sur ce fichier "libperl.so.5.10.1", lien que j'ai appelé "libperl.so".

2°/ Après avoir fait ça, il me met un message d'erreur différent : "ERROR:  could not load library "/opt/PostgreSQL/9.1/lib/postgresql/plperl.so": /opt/PostgreSQL/9.1/lib/postgresql/plperl.so: undefined symbol: Perl_sv_2bool_flags"

J'ai cherché sur le net, rien trouvé. Une idée ? Faut-il une version particulière de libperl ? Quelqu'un a-t-il déjà réussi à installer pl/perl pour PostgreSQL 9.1 sous Ubuntu 10.04 LTS ?

Merci.

#11 Re : Général » Problème dans PGAdminIII / Query avec postGreSQL » 21/06/2011 16:12:30

SQLpro a écrit :

Mais dans l'interface pgAdminIII (version 1.12.3) je vois 4 serveurs en 2 groupes :
- le premier groupe contient les 3 serveur
- le deuxième groupe ne contient que le 9.1
Déjà je ne comprend pas pourquoi et comment y remédier.

Concernant les groupes, on peut en créer des personnalisés en tapant simplement le nom du groupe qu'on veut dans les propriétés des serveurs (clic-droit sur un serveur --> propriétés --> tout en bas on a la liste des groupes, on peut choisir d'affecter le nouveau serveur soit à un groupe existant grâce à la liste déroulante, soit créer un nouveau groupe en tapant simplement le nom).

Par contre apparemment pas moyen de se débarasser du groupe par défaut (celui qui s'appelle "Serveurs"), le serveur qui tourne sous le port par défaut (5432) se retrouve automatiquement dans ce groupe. Si on l'affecte à un autre groupe, il apparaît bien dans l'autre groupe, mais il reste quand même dans le groupe "Serveurs", qu'on ne peut apparemment pas supprimer

#12 Général » foreign key sur une table système » 21/06/2011 16:02:16

bebert73
Réponses : 2

On ne peut pas faire de clé étrangère qui pointe sur une table système, ou c'est moi qui ai loupé quelque chose ?

J'ai essayé le code suivant :

CREATE TABLE tiers (
    id        INTEGER PRIMARY KEY,
    nom        VARCHAR(64) NOT NULL,
    dblogin    NAME
            REFERENCES pg_catalog.pg_authid(rolname)
                ON UPDATE CASCADE
                ON DELETE CASCADE
);

Ca me donne : ERREUR:  droit refusé : « pg_authid » est un catalogue système (nota : je suis bien connecté en tant que super-utilisateur postgres)

A noter qu'on s'en sort très bien avec un trigger

#13 Re : Réplication » precautions a prendre en vue d'une future réplication des données » 21/06/2011 12:25:03

ok merci, oui, c'est plus ou moins ce que je comptais faire : en fait je comptais mettre dans la clé primaire le USER (les USERS qui utiliseront un ordi portable avec une base décentralisée devront donc penser à faire la synchro avant de retourner bosser sur le serveur central).

et comme outil pour faire ça, d'après ce que j'ai compris, BUCARDO est le mieux adapté

#14 Re : Réplication » precautions a prendre en vue d'une future réplication des données » 16/06/2011 21:06:59

Donc en résumé :

- réplication maître-maître : Bucardo (ou Rubyrep)

- réplication maître-esclaves de l'instance complète : la réplication interne de PG

- réplication maître-esclaves de certaines bases ou tables seulement, avec pas ou peu de déconnexions : Slony (ou Londiste)

- réplication maître-esclaves de certaines bases ou tables seulement, avec déconnexions fréquentes et/ou synchros à la demande : Bucardo

Là j'y vois plus clair

Merci !

#15 Re : Réplication » precautions a prendre en vue d'une future réplication des données » 16/06/2011 15:38:45

ok merci c'est clair

la difficulté c'est de choisir le bon outil, il y en a tellement...

Si je résume un peu la grille de choix d'un outil de réplication pour PG (du moins ce que j'en ai compris) :

- si on veut une réplication maître-maître, le choix est Bucardo ou Rubyrep

- si on veut une réplication maître-esclaves avec des esclaves dont l'instance complète est en lecture seule, le choix est la réplication interne de PG

- si on veut une réplication maître-esclaves mais avec uniquement un groupe de table en lecture seule, les autres tables pouvant être en écriture (et pouvant même servir de tables maîtresses pour d'autres réplications), on choisira plutôt Slony (ou Londiste aussi à ce que j'ai lu)




Et par contre même dans ce dernier cas, vous semblez privilégier Bucardo

gleu a écrit :

Slony peut être un bon candidat. Le problème est le blocage de la synchronisation pendant une longue période, très fréquemment. Il n'est pas prévu pour ça. Ce que j'ai entendu dire de Bucardo me fait dire qu'il semble mieux prévu pour ça. Donc j'aurais plutôt tendance à tester Bucardo, puis Slony.

Finalement, y-a-t-il un cas où vous pensez que Slony serait plus adapté que Bucardo ?

#16 Re : Réplication » precautions a prendre en vue d'une future réplication des données » 16/06/2011 15:04:02

ok merci pour ces infos complémentaires

concernant la remarque de SQLPro, il semble que ce soit aussi ce que fait aussi Bucardo, c'est ce qu'a dit Guillaume plus haut :

gleu a écrit :

bucardo propose trois méthodes : soit on privilégie toujours le serveur 1, soit on privilégie toujours le serveur 2, soit il exécute une fonction utilisateur qui aura le dur travail de choisir laquelle privilégier.

C'est cette fonction utilisateur qui pourrait décider par exemple de choisir l'enregistrement le plus récent


Par contre, Guillaume, un truc qui m'échappe encore :

gleu a écrit :

La réplication interne de PG ne vous conviendra pas. Les esclaves sont en lecture seule, quelque soit les opérations à faire.

Je comprend cette phrase comme "la réplication internet de PG ne convient pas CAR dans cette réplication les esclaves sont en lecture seule". Si c'est bien ce que vous vouliez dire, dans ce cas je ne comprends plus, ça veut dire que dans un outil comme Slony les esclaves ne sont PAS en lecture seule ? D'après ce que j'avais compris, un maître est un serveur dans lequel on peut insérer des données, et un esclave est un serveur qui reçoit ses données exclusivement d'un (ou plusieurs) maîtres, mais dans lequel on ne peut en aucun cas entrer des données directement. Autrement dit, j'avais compris qu'un esclave, par définition, est forcément en lecture seule. C'est ça, ou il y a un truc qui m'échappe ?

#18 Re : Réplication » precautions a prendre en vue d'une future réplication des données » 15/06/2011 23:27:37

gleu a écrit :

Si ce sont des vrais schémas différents, même un système de réplication maître/esclave fonctionnerait.

Ok oui à ce moment là ce serait comme si lors de la réplication, chaque serveur serait à la fois maître et esclave de l'autre, en fonction des tables. Maîtres pour certaines tables, esclave pour d'autres. On serait donc bien dans ce qu'on appelle la réplication maître/esclave, et non pas maître/maître. C'est bien ça ?

gleu a écrit :

Je vois deux possibilités en fait :
* soit des tables différentes,
* soit des une numérotation différente de la séquence (de 1 à 100000 pour le site 1, de 100001 à 200000 pour le site 2, etc).

Oui je pensais vraiment à des schémas différents (donc des tables différentes).

gleu a écrit :

Je ne voudrais pas avoir l'air d'insister mais, même là, Bucardo me semble un bon choix. Si tant est qu'il existe un bon choix...

A vrai dire je ne me suis jamais intéressé en profondeur à ce sujet, mais je n'ai jamais entendu parler de Bucardo avant. J'avais cru comprendre qu'il y avait un outil de réplication plus ou moins "officiel" de PG, qui s'appelle Slony, et que depuis la version 9 PG intègre même en natif une réplication (je crois même avoir lu quelque part que c'était la raison principale pourquoi ils ont changé de version majeure et sont passés de 8.x à 9). Donc même dans le cas d'une réplication maître/esclave, vous me conseilleriez Bucardo ? Et pas Slony, ni la réplication intégrée à PG ?

#19 Re : Réplication » precautions a prendre en vue d'une future réplication des données » 15/06/2011 22:04:36

gleu a écrit :

Le plus gros problème dans le cas du maître/maître est de gérer les conflits. Que doivent faire les moteurs lorsqu'ils se synchronisent si deux éléments ont le même identifiant ?

Justement, c'est dans ce sens que je pensais qu'il serait peut-être plus simple de le faire manuellement... Comment un outil "généraliste" tel que bucardo peut-il régler les conflits ? A priori, la résolution des conflits ne peut se faire qu'au cas par cas, en fonction de la logique applicative, non ?




Par contre j'ai un autre cas de figure pour lequel il pourrait ne pas y avoir de conflits si les tables sont correctement conçues, je voulais avoir votre opinion pour savoir quel serait l'outil le plus approprié dans ce cas précis :
Une ONG qui travaille dans les pays en voie de développement possède une trentaine de sites répartis dans le pays (appelons les P1 à P30) sur lesquels ils saisissent diverses données (données météorologiques, agricoles, etc...). A ce jour ces sites sont raccordés par une liaison satellite à un site central (appelons le P0) où se situe la base de données. Tout cela fonctionne bien, mais les 30 liaisons satellites sont coûteuses. Ils souhaiteraient effectuer une refonte du système d'information, dans le but essentiellement de faire des économies en terme de télécoms. L'une des pistes envisagées est de conserver les liaisons par satellite, mais au lieu d'avoir 30 liaisons permanentes, de n'en conserver plus qu'une seule qui "balayerait" à tour de rôle chacun des sites distants (on aurait donc tour à tour des liaisons P0-P1, puis P0-P2, puis P0-P3, etc., les liaisons étant à chaque fois établies le temps que la synchronisation puisse se faire)

On aurait donc un serveur sur chaque site, qui devrait se synchroniser avec le serveur central P0 à chaque fois que la connexion est établie. L'objectif est non seulement que P0 centralise les données de tous les autres sites (donc de P1 à P30), mais aussi que sur chaque site ils aient les données des autres, mais bien sur uniquement en lecture seule. Mon idée serait de regrouper les données de chaque site dans un schéma à part (on aurait donc autant de schéma que de sites). Appelons ces schémas de S1 à S30. Le serveur P1 ne peut écrire que dans le schéma S1, le serveur P2 dans le schéma S2, etc...

Donc, lorsque par exemple la liaison P1-P0 est établi, le schéma S1 est mis à jour de P1 vers P0, et les schéma S2 à S30 sont mis à jour de P0 vers P1.
Puis s'établit la liaison P2-P0, le schéma S2 est mis à jour de P2 vers P0, et les schémas S1 et S3 à S30 sont mis à jour de P0 vers P2.
Puis s'établit la liaison P3-P0, le schéma S3 est mis à jour de P3 vers P0, et les schémas S1, S2 et S4 à S30 sont mis à jour de P0 vers P3.
Et ainsi de suites...

On se retrouve toujours encore dans une configuration maîtres-maîtres, vu que lors de chaque établissement de connexion des données sont écrites dans les deux sens, par contre il ne peut pas y avoir de conflits d'écriture, dans la mesure où pour chaque schéma il y a un seul serveur autorisé à écrire dedans.

Pensez-vous qu'une telle architecture est envisageable ? Et si oui, quel est l'outil le plus adapté pour cela ?

#20 Re : Réplication » precautions a prendre en vue d'une future réplication des données » 15/06/2011 19:37:29

Merci Guillaume, oui c'est ce qu'il me semblait, il faut gérer cela au niveau de l'application.

Par contre en faisant une recherche sur "bucardo" je suis tombé sur ce post http://forums.postgresql.fr/viewtopic.php?id=260 qui traite de la même problématique et dans lequel vous disiez carrément que

gleu a écrit :

Non, ça n'existe pas, quelque soit le moteur de base de données...

Autre question, quel est l'apport d'un outil comme bucardo par rapport à une programmation purement manuelle ? Je veux dire, dans l'absolu ça doit pas être si compliqué que ça à faire manuellement, il suffit de faire des triggers ON INSERT/UPDATE/DELETE qui écrivent dans une table spécifiquement prévue à cet effet les clés primaires des données à répliquer lors de la prochaine synchro. Lors de la synchro il suffira ensuite de répliquer les données en question, en changeant éventuellement les valeurs des clés primaires dans certains cas (cas où la clé est une séquence). Ca me semble tout à fait faisable manuellement, quel serait l'apport d'un outil comme Bucardo et/ou Rubyrep dans ce cas ?

#21 Réplication » precautions a prendre en vue d'une future réplication des données » 15/06/2011 15:51:00

bebert73
Réponses : 18

Bonjour,

Pour l'instant je n'en suis pas encore au stade de la réplication, par contre je me demande s'il y a des précautions à prendre (par exemple dans le choix des clés primaires) si on sait que dans le futur on veut répliquer des données.

Voilà ce que je souhaite faire.

Supposons une base comprenant notamment une gestion de contacts (une table des tiers, avec les téléphones, etc... etc... bref tout à fait classique). Comme clé primaire de ma table "tiers", j'ai choisi un SERIAL.

Il est possible qu'à l'avenir je veuille avoir une base "décentralisée" sur mon ordi portable, pour pouvoir continuer à travailler même sans connexion sur le serveur.

Quel est le meilleur outil pour gérer la réplication entre le serveur et le portable dans ce cas ? Notamment, je me pose des questions du genre : supposons qu'au moment de la synchronisation, le dernier SERIAL utilisé soit par exemple le n° 1234. Que se passe-t-il si je crée un nouveau tiers sur mon ordi portable (qui aura donc le n° 1235), et que pendant ce temps quelqu'un créé un autre tiers sur le serveur (qui aura donc aussi le n° 1235) ? Que va-t-il se passer lors de la réplication suivante ? Y-a-t-il des outils de réplication qui gèrent automatiquement ce cas de figure,  ou bien faut-il prendre d'ores et déjà des précautions dans le choix des clés primaires (par exemple avoir comme primary key une combinaison du serial et du username, ou un truc du genre...)

#23 Général » nom de variable dans une fonction SQL » 10/06/2011 21:44:01

bebert73
Réponses : 2

Bonjour,

y-a-t-il une astuce pour utiliser le nom d'une variable dans une fonction SQL, au lieu d'utiliser $1, $2, etc. (comme dans plpgsql) ?

Par exemple la fonction suivante renvoie un message d'erreur "la colonne « toto_in » n'existe pas"
CREATE OR REPLACE FUNCTION toto(IN toto_in INTEGER) RETURNS INTEGER AS $$
    SELECT toto_in * 2;
$$ LANGUAGE SQL;


On est obligé de référencer la variable avec $1. Ainsi la fonction suivante marche :
CREATE OR REPLACE FUNCTION toto(IN toto_in INTEGER) RETURNS INTEGER AS $$
    SELECT $1 * 2;
$$ LANGUAGE SQL;


Mais en PL/PGSQL on peut référencer la variable par son nom. La fonction suivante marche.
CREATE OR REPLACE FUNCTION toto(IN toto_in INTEGER) RETURNS INTEGER AS $$
DECLARE
retour    INTEGER;
BEGIN
    SELECT toto_in * 2 INTO STRICT retour;
    RETURN retour;
END;
$$ LANGUAGE plpgsql;



Y-a-t-il une astuce pour utiliser aussi les noms des variables dans une fonction SQL ? Ou alors est-on obligé d'utiliser les $1, $2, ... ?

#24 Re : PL/pgSQL » utililisation d'un type "tableau" dans pl/pgsql » 09/06/2011 19:09:47

ok, donc la fonction est complètement inutile dans ce cas, il faut privilégier la vue même si on veut ramener une seule ligne

ça marche

merci !

#25 Re : PL/pgSQL » utililisation d'un type "tableau" dans pl/pgsql » 09/06/2011 18:19:07

ok si je crée le type t_designation ça marche en effet, je pensais qu'on pouvait créer temporairement un type au sein d'une fonction si on n'en a pas besoin ailleurs

Marc Cousin a écrit :

Une vue serait bien plus appropriée, cela sera entre autres plus performant: avec votre façon d'écrire, vous forcez la méthode d'exécution de la requête. Il est probable que le moteur aurait été bien plus performant si on lui avait laissé davantage de liberté.

une question concernant la façon dont PG gère les vues : j'ai bien compris que pour ramener l'ensemble des articles valides et leur désignation dans la bonne langue, une vue est bien plus performante qu'une fonction qui boucle sur tous les articles

Mais supposons que je veuille ramener la designation d'un seul article.

J'ai deux possibilités :
- soit faire un SELECT sur la vue que je viens de créer (par exemple SELECT designation FROM v_mes_articles WHERE id_article = 212)

- soit utiliser la fonction get_designation (IN article_in INTEGER), cette fonction faisant directement un SELECT dans la table des designations (par exemple SELECT designation FROM designations WHERE id_article = 212 AND langue = get_langue(USER))

Quelle est la meilleure solution ? Pour ramener une seule ligne j'opterais pour la 2ème (la fonction) car je suppose que si on utilise la vue, postgresql doit d'abord la construire avant de ramener la ligne souhaitée (donc construire la vue de toutes les désignations de tous les articles valides dans la langue du user), non ?.

A moins que postgresql n'arrive à optimiser la construction de sa vue en fonction du SELECT (c'est à dire à ne construire qu'une vue partielle, avec uniquement la ligne qui nous intéresse). Il  sait faire ça ?

Pied de page des forums

Propulsé par FluxBB