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

#26 Re : Général » Construction de bases avec vues modifiables » 27/02/2018 17:22:28

Bonjour @☺gleu et merci de votre réponse.
Pour le moment rien n'est définit en tant que tel puisque tout est à construire.
J'ai lu sur le bouquin PostgreSQL "Architecture et notions avancées" (je pense que c'est vous l'auteur ;-) ) que les vues permettant depuis la version 9.3 de mettre à jour directement les tables si la vue n'est pas construite à partir de jointure. Dans mon cas, étant donné que mon MCD sera plutôt réalisé "dans les règles de l'art" il sera plutôt aboutie mais inutilisable d'un point de vue logiciel.
Si je prend un exemple même très simple comme ceci :

180227042510730795.jpg

Et que mon logiciel utilise une table unique contenant le jockey, le cheval et la course, comment cela se passe ? j'imagine que mon cas n'est pas unique.

Geo-x

#27 Général » Construction de bases avec vues modifiables » 27/02/2018 15:41:09

Geo-x
Réponses : 8

Bonjour @ tous.

J'ai une question d'architecture globale, je suis en train de construire un MCD propre avec liens, tables, clé, index et tutti quanti.

Le MCD en tant que tel n'est pas utilisable par le biais de logiciels tierces, alors ce que je souhaite faire, c'est créer des vues adaptée sur lesquelles l’utilisateur pourrait faire des modifs, de la visu etc...

J'utiliserais la dernière version de Postgres, et pour les vues, j'imagine, qu'étant donné qu'il y a des liaisons, je serai obligé de créer des règles.

Que pensez-vous de cette manière de procéder ? Quelles sont vos expériences sur cette façon de faire ?

Par avance merci de vos retours.

Geo-x

#28 Optimisation » Optimisation d'architecture » 26/02/2018 19:47:15

Geo-x
Réponses : 0

Bonjour @ tous.

J'ai une question qui me turlupine depuis un petit bout de temps et je ne sais pas vraiment s'il existe une réponse idéale, je souhaiterais avoir votre avis.

Admettons que j'ai deux tables avec les relations suivantes : Table1 < 1,n ---------- 1,n > Table2 (vous l'aurez compris il peut y avoir plusieurs Table2.ID associé à un ou plusieurs Table1.ID et inversement.

Dans ce cas, vaut-il mieux construire sa base en faisant :

Solution 1

Table1 (ID) Table2 (ID) TableLien1_2 (ID1,ID2)

Quitte à reconstruire les jointures dans une vue

Solution 2

Table1 (ID,ID2_1,ID2_2,ID2_3)

si on connait à l'avance le max ou

Table1 (ID,ID2_multi)

par exemple en écrivant ID2_1;ID2_2;ID2_3

Solution 3 Autre solution que je ne connais pas

Qu'en pensez-vous ?

Geo-x

#29 Re : PL/pgSQL » cannot perform INSERT RETURNING » 01/08/2017 13:23:10

Le problème ne semble pas propre à QGis, j'ai déjà pu constater ce problème lorsque j'ai voulu faire une insertion dans une vue regroupant deux tables directement dans Postgres.

#30 Re : PL/pgSQL » cannot perform INSERT RETURNING » 01/08/2017 12:02:28

D'une manière générale, dans le RETURNING, lorsque vous souhaitez afficher : un champ caractère vide vous pouvez mettre :

'' AS monchamp

s'il s'agit d'un champ nombre vous pouvez mettre :

0 AS monchamp

dans les deux cas vous pouvez mettre :

NULL AS monchamp

Si je regarde votre exemple, votre INSERT ne concerne pas le champ 'type_cable', par conséquent, il faut que vous le déclariez dans le RETURNING au même titre que le champ 'nb_fo' avec :

NULL AS monchamp

ou 

'' AS monchamp

ou 

0 AS monchamp

selon le type de champ.

#31 Re : PL/pgSQL » cannot perform INSERT RETURNING » 01/08/2017 10:41:31

Je vous ai donné dans l'exemple un RETURNING en lien avec le code que vous m'aviez fourni, par conséquent, dans votre table complète, la colonne geom n'est pas en troisième position mais en dernière position.

Si vous appliquez tel quel l'exemple fournit, vous dites dans votre régle ce que votre vue doit afficher dans une 15aine de champs alors qu'il faudrait lui dire pour une 30aine (champs de votre table). Il faut, dans votre clause RETURNING, que vous disiez ce qu'il doit renvoyer au niveau de votre vue pour les lignes nouvellement insérées.

Exemple :
> Table :

champ1, champ2, champ3,champ4,champ5

> Régle d'insertion :

INSERT INTO (champ1,champ3,champ5) VALUES (new.champ1,new.champ3,new.champ5) RETURNING champ1, '' AS champ2, champ3, 0 AS champ4,champ5

Vous dites ainsi à votre vue ce qu'il faut qu'elle affiche pour ces lignes nouvellement insérées.
Concernant QGis, je ne sais pas s'il s'agit de l'évolution de Postgres qui inclut cette contrainte, ou si c'est celle de QGis...

Geo-x

#32 Re : PL/pgSQL » cannot perform INSERT RETURNING » 01/08/2017 09:43:32

Bonjour Girish.

Dans l'exemple évoqué plus haut, il s'agissait d'effectuer une insertion sur quelques champs de la table et non sur l'intégralité.
Afin que cette insertion puisse fonctionner, il fallait pouvoir "déclarer" l'intégralité des champs de la table d'où le RETURNING (...) appelant tous les champs de la table.

Donc pour répondre à votre question : Quels sont les champs renseignés dans la clause RETURNING ? > Tous les champs de votre table (ou de vos tables)

Cela donnera quelque chose du genre :

RETURNING id_cable, identifiant, geom, dms, commentaire, longueur, id_type_cable, id_nb_fo, id_role_fibre, id_type_fo, xlbl, ylbl, olbl, t_pol, c_pol, c_cad, cad_lbl, com, xlbl1, ylbl1, olbl1, id_etat, id_dossier, id_situation;

Pour information, dans mon cas également il s'agissait d'un travail avec QGis :-)

Geo-x

#33 Re : PgAdmin3 » Réasultat de requête trop long (...) » 26/04/2017 08:40:10

Bonjour, c'est parfait jmarsac, merci beaucoup !

#34 PgAdmin3 » Réasultat de requête trop long (...) » 25/04/2017 15:33:20

Geo-x
Réponses : 4

Bonjour @ tous.

Suite à un changement de version de PG Admin (V 1.22.2), dès que mon résultat de requête est trop long, le résultat est coupé par ceci : (...)

Ou puis-je modifier ce paramétrage ?

Par avance merci de votre aide.

Geo-x

#36 Re : PL/pgSQL » cannot perform INSERT RETURNING » 07/02/2017 09:18:23

J'ai compris d’où venait le problème.
Comme indiqué ma vue reprend des champs de la table mais crée des colonnes supplémentaires en calculant des indicateurs.
La vue doit pouvoir afficher les colonnes concernant ces indicateurs, du coup il faut l'intégrer dnas le RETURNING même si ce sont des valeurs "fantômes" du genre

CREATE OR REPLACE RULE "_INSERT" AS
ON INSERT TO view_table DO INSTEAD  INSERT INTO table (id, wkb_geometry, nom) 
VALUES (new.id, new.wkb_geometry, new.nom)
RETURNING id, wkb_geometry, nom, 0::numeric AS indicateur1, 0::numeric AS indicateur2;

Il est nécessaire d'utiliser la même technique, si la vue comporte également un ON UPDATE.

Geo-x

#37 Re : PL/pgSQL » cannot perform INSERT RETURNING » 06/02/2017 12:36:56

Bonjour Gleu.
J'utilise les triggers pour les tables uniquement mais pas pour les vues, je ne sais pas forcément comment les utiliser correctement.

Comment feriez-vous ?

#38 Re : PL/pgSQL » cannot perform INSERT RETURNING » 06/02/2017 12:27:32

Et malheureusement non, j'ai tenté mais j'ai ce message qui apparait : ERROR:  RETURNING list's entry 30 has different type from column "stat_view"

Si j’interprète correctement, c'est parce qu'il y a dans ma vue des colonnes qu'il n'y a pas dans la table source. Alors j'ai essayé de faire quelque chose du genre

RETURNING table.nom,table.wkb_geometry,(...)

, mais pas mieux...

Les new.col1 renvoient des valeurs type 'blablabla', habituellement ça fonctionne :-)

#39 PL/pgSQL » cannot perform INSERT RETURNING » 06/02/2017 11:29:38

Geo-x
Réponses : 14

Bonjour @ tous.

J'ai créé une vue avec quelques règles associées pour le cas notamment, d'insertions.

Cette règle semble cependant connaître quelques dysfonctionnements puisque je reçois le message d'erreur suivant : ERROR:  cannot perform INSERT RETURNING on relation "view_table" suivi de HINT:  You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause.

Je ne comprends pas ce que cela veut dire. Ma règle d'insertion ressemble à ceci (en simplifié pour vous éviter le gros pavé) :

CREATE OR REPLACE RULE "_INSERT" AS
ON INSERT TO view_table DO INSTEAD  INSERT INTO table (id, wkb_geometry, nom) 
VALUES (new.id, new.wkb_geometry, new.nom);

Avez-vous une idée qui me premettrait de sortir de ce pétrin ?

Par avance merci.

Geo-x

#40 Re : PL/pgSQL » Une ligne vide en résultat plutôt que rien » 26/01/2017 14:57:55

Ce n'est pas vraiment fait pour

Je suis bien d'accord sur cet aspect théorique, mais dans la pratique, non seulement (dans des cas hyper rares je vous l'accorde) c'est utile, mais en plus, votre technique fonctionne très très bien et je vous en remercie !

Geo-x

#41 PL/pgSQL » Une ligne vide en résultat plutôt que rien » 26/01/2017 12:15:58

Geo-x
Réponses : 2

Bonjour @ tous.
J'ai un problème tout bête, si je fais cette requête :

SELECT nom FROM table WHERE nom = 'azerty'

et que la seule valeur présente dans ma table est qwerty je vais avoir en résultat, le nom de ma colonne sans tuple.
Si j'utilise la commande COALESCE, je n’aurais guère mieux.

Est-il possible d'avoir une tuple vide ou avec un résultat par défaut ? Et si oui comment faire ?

Par avance merci.

Geo-x

#42 Re : PL/pgSQL » quote to NULL » 26/01/2017 12:05:55

Après plus de deux ans de test, je tenais simplement à préciser que cette façon de faire est la plus sûre, même si elle ralentit un tantinet la requête associée.

Geo-x

#43 Re : PL/pgSQL » ERROR: cache lookup failed for function 126242919 » 20/01/2017 11:58:31

Et oui mais je n'ai malheureusement pas la main dessus... je vous tiens au courant, le jour ou tout sera à jour.

#44 PL/pgSQL » ERROR: cache lookup failed for function 126242919 » 20/01/2017 11:30:19

Geo-x
Réponses : 3

Bonjour @ tous.

Je vous explique mon problème, j'ai développé un trigger sur l'ensemble des table de mes bases de données. Le but de ce trigger est que lorsqu’il y a une mise à jour dans n'importe quelle table, je souhaite désactiver cette fonction et mettre à jour une table servant à indiquer qu'il y eu une mise à jour.
Ma fonction trigger ressemble à ceci :

UPDATE a_admin_backup SET backup = 1;
DROP FUNCTION public.backup() CASCADE;

RETURN NEW;

Donc rien de compliqué et tout fonctionne à merveille sauf lorsque je tente de faire directement une mise à jour via pgAdmin ou là j'ai ce message qui apparait :

ERROR: cache lookup failed for function 126242919

précédé de

PL/pgSQL function "backup" line 3 at SQL statement

qui indique sa diufficulté à gérer le DROP function.

Je suis sur cette version de Postgres : "PostgreSQL 9.1.9, compiled by Visual C++ build 1500, 64-bit" (Et oui je sais qu'il s'agit d'une vieille version, qui n'est plus supporté ;-) )

Que puis-je faire pour que cela fonctionne correctement ?

Par avance merci

Geo-x

#45 Re : PL/pgSQL » pg_dump si nécessaire » 08/12/2016 11:55:23

Tant pis et dommage à la fois, merci beaucoup.

Geo-x

#46 PL/pgSQL » pg_dump si nécessaire » 08/12/2016 11:39:52

Geo-x
Réponses : 2

Bonjour @ tous.

Je souhaitais savoir s'il était possible, d'une manière ou d'une autre, de ne lancer un pg_dump qu'en cas de modification d'une Base De Données ?

Par avance merci de votre aide.

Geo-x

#47 Re : PL/pgSQL » Lister noms de colonnes associées à une séquence » 14/11/2016 14:34:28

Ah oui d'accord, je n'avais pas pensé à ces possibilités, merci du partage de savoir.

Si je résume, il n'est donc pas possible de détecter les colonnes impactées par une séquence, à moins qu'elles ne soient directement créées en serial.

Merci beaucoup pour toutes ces précisions Julien.

Geo-x

#48 Re : PL/pgSQL » Lister noms de colonnes associées à une séquence » 14/11/2016 14:23:05

Bonjour Julien et merci de votre réponse.

Quand vous dites qu'il n'est pas forcément nécessaire d'associer une séquence à une colonne, je ne comprends pas, à quoi peut être rattachée une séquence autre que des colonnes ?

#49 PL/pgSQL » Lister noms de colonnes associées à une séquence » 14/11/2016 12:17:50

Geo-x
Réponses : 6

Bonjour @tous.

J'essaie de construire une requête permettant de lister les colonnes concernées par une séquence.

Je sais lister les séquences :

SELECT * FROM pg_class c WHERE c.relkind = 'S';

mais je n'arrive pas à trouver l'endroit ou je peux trouver la colonne associée.

Auriez-vous une idée ?

Par avance merci.

Geo-x

#50 Re : PL/pgSQL » Problème d'utilisation du pg_restore » 28/10/2016 12:09:33

Merci pour l'information Julien (concernant la dépréciation de la version 9.1).

Concernant mon problème vous m'avez parlé, dans votre avant-dernier post du fichier "pgpass".
Je suis donc allé voir de ce côté-là et en lisant la documentation j'ai compris qu'il fallait que j'indique, suite à la table destination les options -h -p -U.
A partir de là, j'ai utilisé le code proposé dans votre dernier post et cela fonctionne à merveille !

Un grand merci pour votre aide.

Geo-x

Pied de page des forums

Propulsé par FluxBB