Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#51 Re : Général » Problème sur requete UPDATE avec select for update » 04/12/2019 15:53:43
Pour la théorie de l'index corrompu, il y a un module pour tester ça:
#52 Re : Général » Problème sur requete UPDATE avec select for update » 04/12/2019 15:50:00
je pense que c'est plutôt le "returning" de l'update qui retourne plusieurs lignes
C'est aussi comme ça que je le comprends, mais si on suppose que message.id est une clef primaire,
un UPDATE message SET ... WHERE id IN (...) RETURNING *
qui retourne plusieurs lignes, ça laisse penser que la sous-requête du IN (...) retourne plusieurs valeurs.
Ceci dit je me demande si un index corrompu sur message.id pourrait provoquer ce phénomène bizarre indépendamment du détail de ce qu'il y a dans la clause IN.
#53 Re : Général » Problème sur requete UPDATE avec select for update » 04/12/2019 13:37:55
Qu'un LIMIT 1 ramène plus qu'une ligne parait assez extraordinaire. Peut-on en savoir plus sur le contexte:
- quelle est la définition de la table, index compris?
- le niveau d'isolation est-il read committed (le niveau par défaut) ou autre?
- est-ce que toutes les transactions qui utilisent la table sont dans le même niveau d'isolation?
- qu'est-ce qu'il y a comme autres comme opérations concurrentes probables sur la table (INSERT? DELETE?)
- est-ce que message.id peut changer? est-ce que message.id_queue peut changer?
#54 Re : Général » Message d'erreur à création d'index » 27/11/2019 19:23:04
Effectivement si le CSV est généré sans considérer le guillemet comme un caractère spécial, ça peut produire ce genre de problème. Et c'est assez plausible parce que pas mal de générateurs sont baclés en 3 lignes de code sans se soucier de cette règle ou des champs multilignes.
#55 Re : Général » Message d'erreur à création d'index » 26/11/2019 20:09:15
le fichier résultant à 2 902 297 lignes , étonnant non .
Pas plus que ça, puisque comme l'a écrit Marc plus haut, le nombre de lignes d'un fichier CSV peut être supérieur au nombre d'enregistrements, vu qu'un enregistrement peut s'étaler sur plusieurs lignes.
Le format CSV est décrit ici: https://tools.ietf.org/html/rfc4180
et Postgres suit à peu près cette spécification, sauf pour le CRLF de fin de ligne qui peut être un LF seul.
#56 Re : PL/pgSQL » Calcule d'une médiane sous postGreSql » 11/11/2019 21:31:17
Pour un calcul de médiane tout fait en postgresql moderne, on peut utiliser percentile_cont ou percentile_disc.
Voir https://forums.postgresql.fr/viewtopic.php?id=4218
#57 Re : pgAdmin4 » Absence de connexion au serveur ou la connexion au serveur a été fermé » 04/11/2019 18:10:15
Toutefois toutes mes requetes ne renvoient aucune donnée, sauf le message d'erreur en objet.
Les requetes en insertion apparemment se passent bien (les données sont bien insérées)
Comment savez-vous que les données sont bien insérées si les requêtes ne renvoient aucune donnée?
Pour le message, on s'attendrait plutôt à ce genre de message au bout de quelques minutes d'inactivité avec un firewall agressif entre le serveur et le client (auquel cas on peut utiliser TCP keepalive pour maintenir les connexions ouvertes), ou dans le cas pathologique où PostgreSQL plante à la fin de chaque requête.
Il serait peut être bon de voir ce qui arrive dans le log côté serveur au moment de l'erreur.
#58 Re : Sécurité » sauvegarde incomplète » 01/11/2019 16:15:52
Votre backup a l'air parfait, c'est la restauration qui doit poser problème. Au vu des tables vous utilisez postgis, donc le problème le plus plausible est qu'il ne soit installé pas sur l'instance cible. Dans ce cas les tables qui en dépendent ne sont pas créés, en produisant des erreurs affichées par la sortie écran de la restauration ainsi que dans les logs du serveur.
Si postgis est installé sur la cible, il faut vérifier quelle version par rapport à la base d'origine et s'il y a des indications de migration à suivre dans la doc de postgis par rapport aux sauts de versions.
#59 Re : Site PostgreSQL.fr » Problème de flux (bug?) sur planete.postgresql.fr » 25/10/2019 13:58:40
Apparemment planet.postgresql.org utilise la même base de code (UniversalFeedParser) mais dans une version plus récente.
Peut-être que ça peut inspirer une solution, sachant que le code est publié sur https://git.postgresql.org/gitweb/?p=hamn.git
On voit dans ce code que dans hamnadmin/hamnadmin/util/aggregate.py il fait "import feedparser", qui doit se référer à https://pypi.org/project/feedparser/ qui lui est maintenu.
#60 Re : Site PostgreSQL.fr » Problème de flux (bug?) sur planete.postgresql.fr » 24/10/2019 19:31:51
Pour le https ton site https://rjuju.github.io/ serait un contre-exemple, parce qu'il est bien pris en compte.
Peut-être que ce sont les sites qui ont un certificat gratuit LetsEncrypt, si la base des autorités de certification du côté de l'agrégateur n'a pas été mise à jour depuis un moment .
Ou peut-être une incompatibilité de version TLS entre l'agrégateur et les serveurs https des blogs.
#61 Site PostgreSQL.fr » Problème de flux (bug?) sur planete.postgresql.fr » 24/10/2019 14:48:02
- dverite
- Réponses : 6
Il y a certains blogs qui apparemment ne sont plus agrégés ni sur https://planete.postgresql.fr (la page) ni dans https://planete.postgresql.fr/atom.xml, à vue d'oeil à peu près la moitié.
Dans la liste à droite de la page, titrée "Membres de la planète PGFR", ça a l'air de correspondre aux membres dont le titre des liens est "internal server error" (qu'on voit en passant le pointeur souris dessus) alors que les URLs ont l'air valides.
Est-ce qu'il n'y aurait pas un problème avec la collecte des flux RSS individuels?
#62 Re : Général » [PG9.6]Validation d'une requete au sein d'une transaction » 18/10/2019 14:34:38
J'ai crus que dblink_exec correspondait en gros à dblink_connect puis dblink en enfin dblink_disconnect. Peut-être me suis-je fourvoyé.
Non c'est bien ça
Il y a deux situations très différentes suivant qu'on place le code de gestion d'erreur côté client ou côté serveur ou un mix des deux.
Côté client, on suppose que vous pouvez ouvrir et maintenir deux connexions en permanence. Par exemple si votre appli est en php, vous allez avoir
$db1 = pg_connect($connect_string);
et
$db2 = pg_connect($connect_string);
Les traitements sont lancés avec pg_exec($db1, "BEGIN"); pg_exec($db1, "INSERT.. etc..");
et les logs avec pg_exec($db2, "INSERT INTO log... etc..");
Le fait que la session $db1 soit dans une transaction en échec n'empêchera pas du tout d'insérer via $db2.
Ca suppose juste d'avoir une interface client PG qui soit capable d'avoir plusieurs connexions simultanément; la plupart permettent ça.
L'exemple du premier message de la discussion laisse supposer qu'il y a un besoin d'annuler une transaction suite à l'impossibilité de déplacer un fichier côté client:
BEGIN
PostgreSQL : ajout d'un enregistrement dans la table 1, récupèration de l'ID de l'enregistrement
Application : déplace un fichier en le renommant avec l'ID récupéré. Si erreur, génération d'un message de log à enregistrer dans la table 2.
Si pas d'erreur de transfert fichier : COMMIT sinon ROLLBACK
Pour ce besoin, le module dblink n'est pas nécessaire. dblink devient nécessaire si vous *voulez* logger les erreurs dans une table dans du code serveur des clauses EXCEPTION en plpgsql. Pour cette stratégie il y a encore deux sous-choix possibles:
1. ne pas remonter l'erreur au client et considérer qu'elle est "gérée" après l'avoir loggé l'erreur avec dblink (mauvaise idée (*) mais certains préfèrent procéder comme ça).
2. garder la transaction en échec, et remonter l'erreur au client (=faire un RAISE en plpgsql depuis le bloc d'exception, cf https://www.postgresql.org/docs/current … ages.html)
(*) je n'ai pas de lien Postgres sous la main mais le problème est similaire avec Oracle et il y a de bonnes explications sur le mésusage de la clause WHEN OTHERS avec Oracle ici: http://www.orafaq.com/wiki/WHEN_OTHERS
#63 Re : Général » [PG9.6]Validation d'une requete au sein d'une transaction » 18/10/2019 12:31:41
Si je comprends bien, je n'ai pas le choix : il faut que je mémorise tous les évènements pour les inscrire à la fin de la transaction, car sinon ils seront effacés par le ROLLBAK (le cas échéant).
Vous avez le choix d'écrire les évènements via une connexion dédiée, par le client ou par le serveur via un dblink.
Le fait d'avoir des clauses EXCEPTION qui capturent toutes les erreurs SQL permettent effectivement de consigner l'erreur dans une table, mais fait aussi que tout ce qui précède dans la transaction n'est plus annulé. Donc ça change radicalement le résultat en base en cas d'erreur. Par ailleurs le fait d'enregistrer l'erreur peut aussi provoquer une erreur.
Otez-moi d'un doute : les requêtes préparées sont valides uniquement le temps de la connexion qui les crée
Oui
Quid des fonctions ? Je les crées une fois pour toute sur mon serveur ?
Oui. CREATE FUNCTION namespace.nomfonction a un effet permanent, sauf si namespace=pg_temp.
#64 Re : Sécurité » role et user postgresql » 18/10/2019 11:47:23
Le rôle peut servir à gérer les utilisateurs par groupe. On assigne un même rôle à un ensemble d'utilisateurs avec GRANT rolename TO username1,username2,... et ensuite on fait GRANT ou REVOKE de certains droits sur le rôle au lieu de spécifier individuellement les utilisateurs.
C'est pour cette raison que le rôle n'a pas par défaut le droit de se connecter.
Dans les versions anciennes de PostgreSQL, la notion de groupe d'utilisateurs était plus distincte, il fallait faire CREATE GROUP pour faire des groupes d'utilisateurs. Puis les groupes et les utilisateurs ont été unifiés avec le concept de rôle. Maintenant CREATE GROUP et CREATE USER existent toujours par compatibilité, mais ce sont juste des quasi-synonymes de CREATE ROLE.
#65 Re : Site PostgreSQL.fr » Définir locale séparateur décimal. » 10/10/2019 15:39:04
Le paramètre est
lc_numeric. SHOW pour afficher, SET pour changer.
#66 Re : Général » [PG9.6]Validation d'une requete au sein d'une transaction » 10/10/2019 15:34:17
La méthode du dblink est utilisable dans le cas où il appelé dans une clause EXCEPTION d'un bloc plpgsql. Un tel bloc est soit dans un bloc de code anonyme (DO...<code> LANGUAGE plpgsql) soit dans une fonction.
Ici il semble que ce ne soit pas le cas, c'est-à-dire que les instructions DELETE sont envoyés individuellement par le client et que la logique IF erreur SQL est dans le client. Vous ne pouvez pas utiliser le SELECT dblink_exect() dans cette situation.
Mais vous pouvez (devez en fait) dès qu'il y a une erreur SQL, lancer un ROLLBACK pour annuler définitivement la transaction en cours et de ce fait vous n'aurez plus ces erreurs 25P02.
Une fois ceci fait, il est possible d'insérer l'entrée de log avec un simple INSERT sans besoin d'un dblink. Le point crucial est que ça ne se fait pas dans la même transaction que celle qui était en échec et que vous terminez en exécutant un ROLLBACK explicite.
#67 Re : Général » Afficher quelque chose s'il n'y a pas d'enregistrement dans la table » 02/10/2019 13:54:32
On peut ajouter à une requête une clause du genre
...
UNION ALL
SELECT 'Pas de données' WHERE NOT EXISTS (SELECT 1 FROM nomdelatable)Mais comme dit Julien le côté client sait très bien quand un jeu de résultats est vide, donc cette solution est un pis-aller.
#68 Re : PSQL » differences sqlplus --> psql » 20/09/2019 15:09:47
Tant qu'à réécrire le SQL, voyez si concat() ne serait pas plus lisible. Avec concat() les NULL reviennent au même que les chaines vides au lieu d'avoir l'effet "absorbant" de NULL avec l'opérateur ||:
test=> select concat('abc', ',' , null, ',' , 'def');
concat
----------
abc,,defconcat_ws() peut aussi être utile. C'est encore plus lisible parce qu'on n'a pas besoin de répéter le séparateur mais les NULL sont ignorés.
#69 Re : Site PostgreSQL.fr » Transformation ligne en colonne » 20/09/2019 12:07:02
La table cible a une structure fixe à 1+9+9 colonnes ou la liste de ses colonnes doit être dynamique?
#70 Re : Général » Comparaison de schéma » 12/09/2019 12:53:56
Il y a apgdiff par exemple: https://github.com/fordfrog/apgdiff qui travaille sur le résultat de pg_dump.
Je me souviens l'avoir utilisé avec succès.
#71 Re : Site PostgreSQL.fr » Problème de sequence "avançant" toute seule » 12/09/2019 12:49:01
C'est un fait connu lié au fait que les séquences ne sont pas transactionnées, et à l'usage d'un cache de séquence.
https://wiki.postgresql.org/wiki/FAQ#Wh … n_abort.3F
La solution est par exemple de mettre en oeuvre sa propre séquence avec une table à une seule ligne. Un code correct est proposé ici:
https://stackoverflow.com/a/9985219/238814
CREATE TABLE thetable_id_counter ( last_id integer not null );
INSERT INTO thetable_id_counter VALUES (0);
CREATE OR REPLACE FUNCTION get_next_id(countertable regclass, countercolumn text) RETURNS integer AS $$
DECLARE
next_value integer;
BEGIN
EXECUTE format('UPDATE %s SET %I = %I + 1 RETURNING %I', countertable, countercolumn, countercolumn, countercolumn) INTO next_value;
RETURN next_value;
END;
$$ LANGUAGE plpgsql;
COMMENT ON get_next_id(countername regclass) IS 'Increment and return value from integer column $2 in table $1';#72 Re : Général » restauration database en écrasant l'existant » 04/09/2019 14:27:03
On peut terminer des sessions avec pg_terminate_backend() qui prend en argument le PID de la session, mais une session ne pourra jamais faire un DROP database en étant elle-même connecté à cette base.
Si le but est de recréer la base entièrement, il est possible d'utiliser pg_dump -C -c (les 2) avec le format plain (donc pas de -Ft, laisser le format par défaut), et de jouer ça dans un psql connecté à une autre base. Par exemple la base nommée postgres. Exemple:
pg_dump -C -c mabase > dump-mabase.sql
psql -U postgres -d postgres -f dump-mabase.sql
Le dump va contenir des commandes du genre
DROP DATABASE mabase;
...
CREATE DATABASE mabase ...;
...
\connect mabase
...
puis les commandes de création des objets.
Mais il faut quand même que personne d'autre ne soit connecté à la base concernée quand on joue ce dump.
#73 Re : Général » restauration database en écrasant l'existant » 04/09/2019 13:39:35
C'est l'option -c (c minuscule) ou --clean qu'il faut utiliser pour que les CREATE soient précédés de DROP dans le dump.
#74 Re : Site PostgreSQL.fr » Pb Fonction avec dates » 29/08/2019 14:35:43
Le "CASE" interne semble faux parce que c'est un mélange des 2 formes
CASE expression
WHEN valeur1...THEN
WHEN valeur2... THEN
...et
CASE
WHEN condition1... THEN valeur1
WHEN condition2... THEN valeur1
...Ces deux formes sont valides mais pas un mix des deux.
Indépendamment de ça vous pouvez certainement simplifier toute cette expression qui fait de multiples conversions date/chaîne de caractères pour calculer quelque chose qui sûrement pourrait s'obtenir de manière plus directe. Il faut voir aussi que coder en dur que le dernier jour de février est le 28 est faux à chaque année bissextile. Si le but est de trouver le dernier jour du mois en cours, il faudrait plutôt ajouter un mois et retrancher un jour avec interval '1 month' et interval '1 day'.
#75 Re : Général » Prise en compte d'un index par le planificateur » 26/08/2019 15:13:20
Daniel, à quoi voyez vous que le planificateur n'avait pas de statistique ?
Il n'y a pas de preuve formelle de ça dans l'explain analyze, mais pas non plus de preuve du contraire. Mais c'est une des raisons principales de non-prise en compte d'un index (avec les tables trop petites) parce que c'est un scénario typique: création de table vide, chargement, select.
Sinon, une autre piste: ces CREATE INDEX seraient faits dans une session non committée.
Il se trouve que dans ce qu'on voit ci-dessus, les CREATE INDEX ne sont pas montrés contrairement aux autres commandes. Pour quelle raison? Si vous les faites dans une autre session, avec un autre outil, ça pourrait avoir un rapport avec le problème.