PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

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

#76 Re : PL/pgSQL » Faire un pg_dump en modifiant le nom de la table » 28/01/2016 12:29:12

Ben c'est sûr que le démon est loin d'être parfait ...

Ok merci du coup de main, je test dès que possible !

#77 Re : PL/pgSQL » Faire un pg_dump en modifiant le nom de la table » 28/01/2016 12:24:02

Bonjour Sébastien, merci de votre réponse.

Je suis sur serveur Windows (et oui personne n'est parfait ;-) ) et visiblement la commande 'sed' n'est pas reconnue.

Geo-x

#78 PL/pgSQL » Faire un pg_dump en modifiant le nom de la table » 28/01/2016 12:12:37

Geo-x
Réponses : 12

Bonjour @ tous.

Je souhaiterais copier une table d'une BDD1 > BDD2 en modifiant le nom de la table d’origine.

Pour ça j'utilise les commandes :

pg_dump -U postgres -h localhost -t TABLE1 BDD1 > dump.sql

psql -U postgres -h localhost -d BDD2 < dump.sql

Le problème c'est qu'il conserve le nom d'origine de ma table et je ne sais pas comment faire pour le modifier dès l'enregistrement.

Avez-vous une idée ?

Geo-x

#79 Re : PL/pgSQL » Liaison table et vue » 02/11/2015 09:43:16

Merci Guillaume pour ces précisions.

Alors dans le cas d'une fonction qui est censé agir sur des tables, comment faire en sorte qu'elle ne s'arrête pas si la table en cours de modifications est également utilisée par une vue ?

Geo-x

#80 PL/pgSQL » Liaison table et vue » 30/10/2015 17:24:21

Geo-x
Réponses : 3

Bonjour @ tous.

Dans ma BDD, je souhaiterais mettre à jour le type de champ de certaines tables par le biais d'une fonction.

Malheureusement, je me suis rendu compte que ma fonction bloquait à partir du moment ou de ces tables dépendent des vues.

Ma question est donc la suivante :

- Est-il possible de modifier un type de champ d'une table en cascade afin d'impacter la vue ?
- Dans le cas ou ce n'est pas possible, est-il possible de détecter les tables faisant l'objet d'une utilisation par le biais d'une vue ?

En vous remerciant par avance.

Cordialement.

Geo-x

#81 Re : PL/pgSQL » Utilisation des index » 04/08/2015 10:28:28

Un grand merci rjuju c'est exactement ce que je cherchais !

C'est ça qu'il faudrait sur la doc officiel, du concret et du concis.

Geo-x

#82 PL/pgSQL » Utilisation des index » 04/08/2015 10:10:13

Geo-x
Réponses : 2

Bonjour @ tous.

Je souhaiterais savoir ou il était possible de visualiser le niveau d'utilisation des index par table ?

(Il ne s'agit pas là de tester l'utilisation des index "à la volée" avec EXPLAIN ANALYZE mais bien d'utiliser les statistiques existantes)

Par avance merci.

Geo-x

#83 PL/pgSQL » ORDER BY sur un champ mixte » 26/05/2015 10:05:47

Geo-x
Réponses : 1

Bonjour @ tous.

Une question me taraude, je souhaite faire un ORDER BY sur une colonne déclarée en varchar et qui contient à la fois des numéros et à la fois des lettres.

Ça donne quelque chose du genre :

Col1
------
A
1
10
2
3
12
AA
B

et je souhaiterais que ça puisse donner :

Col1
------
1
2
3
10
12
A
AA
B

J'imagine qu'avec un CASE on devrait pouvoir en tirer quelque chose, mais j'avoue buter un peu là.

Geo-x

#84 Général » Utilisation fonction AsTopoJson » 16/03/2015 20:40:28

Geo-x
Réponses : 0

Bonjour @ tous.

Je n'ai aucune difficulté à récupérer le résultat d'une fonction au format geojson avec Postgres, en revanche lorsque j'essaie de générer un résultat au format TopoJson avec la fonction AsTopoJson mais je n'y arrive pas vraiment.

Je pense manquer d'exemples concrets et le seul disponible sur le site postgis est difficilement adaptable.

Avez-vous déjà utilisé cette fonction? Et auriez-vous quelques exemples?

En vous remerciant par avance.

Geo-x

#85 Re : PL/pgSQL » Trigger générique historisation sur delete » 31/12/2014 11:00:35

Bonjour Guirom.

J'ai créé une fonction trigger qui permet l'enregistrement des données modifiées dans uen table historique.

Pour cela j'ai commencé par créer la table dans laquelle sont enregistrés les éléments modifiés :

CREATE TABLE historique
(
  ogc_fid serial NOT NULL,
  table_modif character varying(120),
  type_modif character varying(120),
  ogc_fid_modif integer,
  date_modif date,
  heure_modif time without time zone,
  original_data text,
  new_data text,
  CONSTRAINT historique_pkey PRIMARY KEY (ogc_fid )
)
WITH (
  OIDS=FALSE
);
ALTER TABLE historique
  OWNER TO postgres;

Puis j'ai créé la fonction trigger :

CREATE OR REPLACE FUNCTION historique()
  RETURNS trigger AS
$BODY$
DECLARE
    old_data text;
    data_modif text;
BEGIN

    IF (tg_op = 'UPDATE')
	
	THEN
        old_data := ROW(OLD.*);
        data_modif := ROW(NEW.*);
        INSERT INTO historique (table_modif,type_modif,ogc_fid_modif,date_modif,heure_modif,original_data,new_data) 
		VALUES (tg_table_name::text,'Update',NEW.ogc_fid,current_date,current_time,old_data,data_modif);
        RETURN NEW;
		
    ELSIF (tg_op = 'DELETE')
	
	THEN
        old_data := ROW(OLD.*);
	data_modif := NULL;
        INSERT INTO historique (table_modif,type_modif,ogc_fid_modif,date_modif,heure_modif,original_data,new_data) 
		VALUES (tg_table_name::text,'Delete',OLD.ogc_fid,current_date,current_time,old_data,data_modif);
        RETURN OLD;
		
    ELSIF (tg_op = 'INSERT')
	
	THEN
	old_data := NULL;
        data_modif := ROW(NEW.*);
        INSERT INTO historique (table_modif,type_modif,ogc_fid_modif,date_modif,heure_modif,original_data,new_data) 
		VALUES (tg_table_name::text,'Insert',NEW.ogc_fid,current_date,current_time,old_data,data_modif);
        RETURN NEW;
		
    END IF;

END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

Et pour finir, j'applique à chaque table pour laquelle je souhaite enregistrer les modifications le lancement de la fonction trigger :

CREATE TRIGGER historique
  BEFORE INSERT OR UPDATE OR DELETE
  ON table
  FOR EACH ROW
  EXECUTE PROCEDURE historique();

Mais peut-être existe-t-il des méthodes plus simple, que je ne connais pas et pour lesquelles je serais curieux de connaitre l'existence.

Geo-x

#86 PL/pgSQL » Utilisation crosstab ou autre solution ? » 09/12/2014 11:07:35

Geo-x
Réponses : 1

Bonjour @ tous.

Je galère un peu à utiliser la fonction crosstab (que je n'arrive pas vraiment à utiliser) sans vraiment savoir s'il s'agit de la solution idéale, je m'explique :

J'ai une table qui contient les champs suivants :

Col1           Col2
Service1      2014-02-10
Service1      2014-02-10
Service1      2013-02-10
Service2      2011-02-10
Service3      2012-02-10
Service3      2013-02-10

Ce que j'aimerais obtenir c'est :

Col1          2011    2012    2013    2014
Service1      0       0       1       2
Service2      1       0       0       0
Service3      0       1       1       0

Pour obtenir ce résultat j'ai tenté un crosstab dont j'ai visiblement du mal à comprendre le comportement en faisant :

SELECT * FROM crosstab (
'SELECT service,COUNT(*) nb,EXTRACT(YEAR FROM date)AS annee FROM device GROUP BY service,EXTRACT(YEAR FROM date) ORDER BY service,EXTRACT(YEAR FROM date)' ,
'SELECT DISTINCT EXTRACT(YEAR FROM date) AS annee FROM device')
as (service varchar,"2010" numeric, "2011" numeric, "2012" numeric, "2013" numeric, "2014" numeric)

Et le résultat de cette requête me donne :

Col1            2011  2012  2013  2014
Service1
Service2 
Service3

Merci de votre aide.

Geo-x

#87 Re : PL/pgSQL » quote to NULL » 18/11/2014 17:52:26

Oui en effet, pour être sur que le champ soit NULL c'est sûrement ce qu'il y a de mieux à faire.

Merci rjuju !

#88 Re : PL/pgSQL » quote to NULL » 18/11/2014 14:08:05

Bonjour Rjuju.

Non, je ne peux pas toucher à mes données (ce serait trop simple ;-) )

et les champs ne sont pas vides, quand je regarde les tables via pgadmin ils contiennent des doubles quotes : '' , mais quand je fais un SELECT champ1, là j'ai un résultat vide.

Et moi ce que j'ai besoin de faire c'est filtrer tous les champs vides/NULL.

#89 PL/pgSQL » quote to NULL » 18/11/2014 13:22:48

Geo-x
Réponses : 5

Bonjour @tous.

Il y a une question à laquelle je n'arrive pas à répondre concernant le passage d'une valeur VIDE en NULL.

En effet, certains champs de ma BDD sont composés de double quote ''. Le problème c'est que lorsque je requête sur ces champs-là (ex. champ1 IS NULL) et bien ils n'appraissent pas dans le résultat.

J'ai donc tenté un certain nombre d'opération pour pouvoir les sélectionner avec ce genre de chose :

select replace(quote_ident(champ1),'""',NULL) from table1

Mais cette requête me met tous les résultats en NULL. J'ai également testé en faisant un simple

replace(quote_nullable(designation),'''','')

Mais pas mieux, je tourne en rond et je ne trouve pas de solution. Existe-t-il une fonction existantes pour régler ce genre de souci ?

Par avance merci.

Geo-x

#90 Re : Optimisation » Table obèse...mais pourquoi ? » 16/09/2014 17:59:39

Affirmatif, sur PG Admin c'est le temps que cette requête met.
Par ailleurs lorsque je lis cette table à partir du logiciel FME, il me faut environ quatre heures pour lire à peine les enregistrements.

En fait, je suis tout simplement en train de me demander si le problème ne vient pas des géométries présentes dans ma table.
Je continue à creuser et vous fait un retour si je trouve des réponses.

#91 Re : Optimisation » Table obèse...mais pourquoi ? » 16/09/2014 09:55:34

Autre fait étrange.

Je viens d'effectuer une requête qui m'a pris 134 567 ms, là ou cette même requête avec un EXPLAIN ANALYZE m'indique :

"Seq Scan on "9_parcelle"  (cost=0.00..3590.40 rows=15355 width=4043020) (actual time=0.026..23.919 rows=15385 loops=1)"
"  Filter: (surface < 500::double precision)"
"Total runtime: 24.524 ms"

#92 Re : Optimisation » Table obèse...mais pourquoi ? » 16/09/2014 09:01:46

Bonjour gleu.

Je vais tenter de répondre à vos questions.

Ma table contient 53 872 enregistrements pour 77 colonnes dont voici les différents types :

"USER-DEFINED" (correspond au type geometry (Polygon))
"character"
"character varying"
"double precision"
"integer"
"text"

En terme de taille, si je l'interroge de la façon suivante :

SELECT
   relname as "Table",
   pg_size_pretty(pg_total_relation_size(relid)) As "Size",
   pg_size_pretty(pg_total_relation_size(relid) - pg_relation_size(relid)) as "External Size"
   FROM pg_catalog.pg_statio_user_tables ORDER BY pg_total_relation_size(relid) DESC;

J'obtiens le résultat de 665Mb en Size et 642Mb en External Size.

Si ils vous manquent des informations n'hésitez pas.

Cordialement.

Geo-x

#93 Re : Optimisation » Table obèse...mais pourquoi ? » 15/09/2014 23:03:30

Bonsoir rjuju.

J'ai tenté de sauvegarder ma table en SQL et cette sauvegarde a généré un fichier .sql pesant...30 Go...!

En revanche je n'ai pas tenté la comparaison avec l'autre table en terme d'enregistrement mais juste en terme d'ouverture des 100 premières lignes et là, c'est édifiant.

Geo-x

#94 Optimisation » Table obèse...mais pourquoi ? » 15/09/2014 18:01:51

Geo-x
Réponses : 8

Bonjour @ tous.

Comme vous pouvez le constaer j'ai une table obèse mais je ne sais absolument pas pourquoi... J'ai une table1 qui contient plus de 100 000 enregistrements et qui ne pose aucun souci de gestion, et à côté j'ai cette fameuse table2 qui compte le même nombre de colonne que table1, et qui ne compte que 54 000 enregistrements et qui pourtant pose d'énormes souci de lenteurs.

J'ai testé le VACUUM, l'indexage etc... mais rien n'y fait.

Existe-t-il une façon d'identifier la source du problème?

Par avance merci de votre aide.

Geo-x

#95 Re : PL/pgSQL » fonction » 03/09/2014 09:06:19

Bonjour Harry.

Il me semble que ce sujet a déjà été traité : http://forums.postgresql.fr/viewtopic.php?id=3044

Geo-x

#96 Re : PL/pgSQL » fusion de ligne par l'ID » 03/09/2014 09:03:41

Bonjour beverdi,

tu as 90% de la réponse dans ta question, pour la mise en place (donc les 10% restants ;-) ) voici à quoi doit ressembler ta requête :

SELECT id,ST_Union(wkb_geometry) FROM ligne GROUP BY id;

Geo-x

#97 Re : PL/pgSQL » Problème de régle d'insertion vue » 04/08/2014 08:07:40

Bonjour rjuju.

Pardon, j'utilise bien le NEW.
Pour ma version de Postgres, il s'agit de la 9.1. J'ai vu en effet qu'il y a bien une notion de trigger qui est arrivé avec cette version mais je ne comprend pas bien la façon de l'utiliser. Est-ce qu'il s'agit d'une utilisation comme sur une table "classique" à la seule différence qu'elle met à jour les tables appelées ?

Geo-x

#98 PL/pgSQL » Problème de régle d'insertion vue » 31/07/2014 16:15:39

Geo-x
Réponses : 3

Bonjour @tous,

je bloque sur un problème qui n'en était pas un jusqu'à aujourd'hui, je m'explique :

J'ai une table tableA (col1,col2,col3,col4) et j'ai une vue view_tableA (col2,col3)

J'ai associé à ma vue une règle d'insertion :

CREATE OR REPLACE RULE "_INSERT" AS
ON INSERT TO view_tableA DO INSTEAD  INSERT INTO tableA (col2,col3) VALUES (col2,col3);

Le problème c'est que Potgres n'apprécie pas vraiment, mais je n'arrive pas à comprendre pourquoi :

You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause

Est-ce que vous avez une idée d’où pourrait venir le problème ?
(Pour info complémentaire, j'ai également des règles associées à la mise à jour et à la suppression d'objet)

Geo-x

#99 Re : PL/pgSQL » GROUP BY sur un SELECT CASE » 07/07/2014 10:38:51

Bonjour Gleu,

Je ne connaissais pas du tout cette syntaxe et j'avoue qu'elle ne m'avait jamais traversé l'esprit jusqu'à aujourd'hui ;-)

En tout cas, ça marche parfaitement, un grand merci à vous.

#100 Re : PL/pgSQL » GROUP BY sur un SELECT CASE » 07/07/2014 08:55:53

Bonjour Gleu.

Je suis bien d’accord avec vous, et je ne souhaite pas faire de GROUP BY sur la colonne sexe, mais si je ne le met pas, postgres me fâche :

ERROR:  column "mobpro2011.sexe" must appear in the GROUP BY clause or be used in an aggregate function
LINE 5: WHEN sexe = 1 THEN sum(nb)

Pied de page des forums

Propulsé par FluxBB