Vous n'êtes pas identifié(e).
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 !
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
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
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
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
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
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
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
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
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
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
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 !
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.
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
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.
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"
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
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
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
Bonjour Harry.
Il me semble que ce sujet a déjà été traité : http://forums.postgresql.fr/viewtopic.php?id=3044
Geo-x
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
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
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
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.
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)