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).

#1 Re : PL/pgSQL » Mise à jour de plusieurs tables à l'aide d'un seule vue » 25/08/2016 09:05:14

Apès avoir modifié l'INSERT pour qu'il contienne tout mes champs j ai ce nouveau message d'erreur


l'enregistrement « new » n'a pas de champs « A_id »


Si j'enleve ce champ de mon insert il me dit la meme chose mais pour le champ suivant
je ne comprends pas pourquoi il m'affiche ça. Faut-il déclarer New? ou bien cette variable n est pas applicable pour un insert (dans ce cas,par quoi faut il le remplacer)?

#2 Re : PL/pgSQL » Mise à jour de plusieurs tables à l'aide d'un seule vue » 23/08/2016 21:50:05

Voici la structure de la table avec la table A qui est ma table principale, dans la vue on retrouve tous les champs présents dans A en plus des champs B1 et C

---------------------------------------------------------------------
        TABLE_A
---------------------------------------------------------------------
pk  A_id       serial NOT NULL,
A_date_modif        date DEFAULT ('now'::text)::date,
A_champ1        character varying(20),
A_champ2        character varying(250),
A_champ3       boolean,
A_champ4        numeric(4,0),
A_champ5        boolean,
A_champ6        numeric(8,4),
A_champ7       numeric(8,4),
A_champ8        numeric(4,0),
A_champ9        boolean,
A_champ10       character varying(50),
A_longueur       numeric(9,4) DEFAULT length('((-1,0),(1,0))'::path),
A_champ11       character varying(100),
A_champ12        character varying(250),
A_champ13       character varying(250),
fk A_champB_id  integer NOT NULL,
fk A_champC_id  integer NOT NULL,

---------------------------------------------------------------------
        TABLE_B
---------------------------------------------------------------------
pk champB_id       serial NOT NULL,
champB1      character varying(50)

---------------------------------------------------------------------
        TABLE_C
---------------------------------------------------------------------
pk champC_id       serial NOT NULL,
champC1      character varying(50),
champC2      character varying(50)

---------------------------------------------------------------------
           VUE
---------------------------------------------------------------------
SELECT
A_id       ,
A_date_modif ,      
A_champ1 ,
champB1     ,
champC1||'-'|| champC2 AS champ_concatener ,
A_champ2        ,
A_champ3       ,
A_champ4 ,      
A_champ5 ,      
A_champ6 ,      
A_champ7     ,
A_champ8 ,   
A_champ9 ,      
A_champ10,      
A_longueur,      
A_champ11,      
A_champ12 ,      
A_champ13

   
FROM
TABLE A
TABLE B
TABLE C


WHERE
A_champB_id  = champB_id AND
A_champC_id  = champC_id



J'utilise les rules pour pouvoir réussir à mettre à jour le champ contenant la géométrie mais je peux peut etre effectivement les intégrer à ma fonction trigger. Pour le coup mes rules fonctionnent (je les ai testé sur une autre vue) c'est au niveau du trigger que ça cloche

#3 Re : PL/pgSQL » Mise à jour de plusieurs tables à l'aide d'un seule vue » 23/08/2016 08:57:50

Oups! Désolée j'ai oublié de le préciser :s

En fait lorsque j'ouvre ma table contenant la géométrie dans QGIS et que j'essaie de la mettre à jour, au moment de l enregistrement il m'affiche :

Impossible de valider les changements pour la couche vue

Erreurs : ERREUR : 1 attribut non-ajouté.
 
Erreur du fournisseur de données :
      Erreur PostGIS lors de l'ajout d'entité : ERREUR:  une valeur NULL viole la contrainte NOT NULL de la colonne «A_CHAMP_B_ID »
    DETAIL:  La ligne en échec contient (11116, 2016-08-23, null, null, null, null, null, null, null, null, null, null, 939.1165, null, null, null, 01050000206B0F000001000000010200000003000000B103684234C63541EFDE..., 79000, null, null, null, null, null, 1, null, null, null)

En gros, seuls mes champs automatiques et la géométrie sont remplis sad

#4 Re : PL/pgSQL » Mise à jour de plusieurs tables à l'aide d'un seule vue » 22/08/2016 17:15:33

Bonjour, mon code SQL ne fonctionne pas, pouvez vous me dire ce qui cloche?

CREATE OR REPLACE RULE insert_on_vue AS
    ON insert TO vue
    DO INSTEAD insert into tableA (the_geom) values (NEW.the_geom);

CREATE RULE maj_vue AS
    ON UPDATE TOvue
    DO INSTEAD UPDATE tableA SET the_geom = NEW.the_geom WHERE A_id = A_id;

CREATE RULE suppr_on_vue AS
    ON DELETE TO vue
    DO INSTEAD DELETE FROM  tableA WHERE the_geom=OLD.the_geom ;

   
CREATE or replace FUNCTION test_maj() RETURNS TRIGGER AS $$
BEGIN
    IF (TG_OP='INSERT')THEN
    ----------------------------------------------------TABLE_A--------------------------------------------------
        INSERT INTO tableA(
                A_id,            A_date_modif,        A_champ1,        A_champ2,           
                A_champ3,        A_champ4,        A_champ5,        A_champ6,
                A_champ7,        A_champ8,        A_champ9,        A_champ10,
                A_longueur        A_champ11,        A_champ12,        A_champ13)
        VALUES (
                NEW.A_id,        NEW.A_date_modif,    NEW.A_champ1,        NEW.A_champ2,
                NEW.A_champ3,             NEW.A_champ4,        NEW.A_champ5,        NEW.A_champ6,
                NEW.A_champ7,        NEW.A_champ8,        NEW.A_champ9,        NEW.A_champ10,
                NEW.A_longueur        NEW.A_champ11,        NEW.A_champ12,        NEW.A_champ13);
    ----------------------------------------------------A_CHAMP_B_ID------------------------------------------------
        CASE     WHEN vue.champB1 = "valeur1" THEN INSERT INTO tablesA(A_champB_id) VALUES (1);
                 WHEN vue.champB1 "valeur2" THEN INSERT INTO tablesA(A_champB_id) VALUES (2);
                WHEN vue.champB1 "valeur3" THEN INSERT INTO tablesA(A_champB_id) VALUES (3);
               WHEN vue.champB1 "valeur4" THEN INSERT INTO tablesA(A_champB_id) VALUES (4);
        ELSE RETURN NULL;
        END CASE;        
    ----------------------------------------------A_CHAMP_C_ID-----------------------------------------------
        CASE     WHEN vue.alias_champC1+champC2= "valeurC1_1-valeurC2_1" THEN INSERT INTO tablesA(A_champC_id) VALUES (1);
                 WHEN vue.alias_champC1+champC2= "valeurC1_2-valeurC2_2" THEN INSERT INTO tablesA(A_champC_id) VALUES (2);
                 WHEN vue.alias_champC1+champC2= "valeurC1_3-valeurC2_3" THEN INSERT INTO tablesA(A_champC_id) VALUES (3);
                WHEN vue.alias_champC1+champC2= "valeurC1_4-valeurC2_4" THEN INSERT INTO tablesA(A_champC_id) VALUES (4);
                WHEN vue.alias_champC1+champC2= "valeurC1_5-valeurC2_5" THEN INSERT INTO tablesA(A_champC_id) VALUES (5);
                 WHEN vue.alias_champC1+champC2= "valeurC1_6-valeurC2_6" THEN INSERT INTO tablesA(A_champC_id) VALUES (6);
                 WHEN vue.alias_champC1+champC2= "valeurC1_7-valeurC2_7" THEN INSERT INTO tablesA(A_champC_id) VALUES (7);
                 WHEN vue.alias_champC1+champC2= "valeurC1_8-valeurC2_8" THEN INSERT INTO tablesA(A_champC_id) VALUES (8);
                 WHEN vue.alias_champC1+champC2= "valeurC1_9-valeurC2_9" THEN INSERT INTO tablesA(A_champC_id) VALUES (9);
                WHEN vue.alias_champC1+champC2= "valeurC1_10-valeurC2_10" THEN INSERT INTO tablesA(A_champC_id) VALUES (10);
                WHEN vue.alias_champC1+champC2= "valeurC1_11-valeurC2_11" THEN INSERT INTO tablesA(A_champC_id) VALUES (11);
                WHEN vue.alias_champC1+champC2= "valeurC1_12-valeurC2_12" THEN INSERT INTO tablesA(A_champC_id) VALUES (12);
                WHEN vue.alias_champC1+champC2= "valeurC1_13-valeurC2_13" THEN INSERT INTO tablesA(A_champC_id) VALUES (13);
        ELSE RETURN NULL;
        END CASE;      
    -------------------------------------------------------------------------------------------------------------------------------------------------------------
        RETURN NEW;   
    -------------------------------------------------------------------------------------------------------------------------------------------------------------
    -------------------------------------------------------------------------------------------------------------------------------------------------------------
    ELSIF (TG_OP='UPDATE')THEN
    ---------------------------------------------------------------TABLE_A---------------------------------------------------------------------------------------
        UPDATE aep.troncon
            SET   
                A_date_modif = NEW.A_date_modif,        A_champ1 = NEW.A_champ1,     A_champ2 = NEW.A_champ2,
                A_champ3 = NEW.A_champ3,            A_champ4 = NEW.A_champ4,        A_champ5 = NEW.A_champ5,
                A_champ6 = NEW.A_champ6,            A_champ7 = NEW.A_champ7,     A_champ8 = NEW.A_champ8,
                A_champ9 = NEW.A_champ9,            A_champ10 = NEW.A_champ10,    A_longueur = NEW.A_longueur,
                A_champ11 = NEW.A_champ11,        A_champ12 = NEW.A_champ12,    A_champ13 = NEW.A_champ13
               
            WHERE    
                OLD.A_id = A_id;
    -------------------------------------------------------------A_CHAMP_B_ID---------------------------------------------------------------------------------------
        CASE     WHEN NEW.vue.champB1 = "valeur1" THEN UPDATE tablesA SET A_champB_id=1 WHERE A_champB_id=OLD.A_champB_id;
                WHEN NEW.vue.champB1 = "valeur2" THEN UPDATE tablesA SET A_champB_id=2 WHERE A_champB_id=OLD.A_champB_id;
                 WHEN NEW.vue.champB1 = "valeur3" THEN UPDATE tablesA SET A_champB_id=3 WHERE A_champB_id=OLD.A_champB_id;
                 WHEN NEW.vue.champB1 = "valeur4" THEN UPDATE tablesA SET A_champB_id=4 WHERE A_champB_id=OLD.A_champB_id;
        ELSE RETURN NULL;
        END CASE;
        IF NOT FOUND THEN RETURN NULL;
        ELSE RETURN NEW;
        END IF;
    -------------------------------------------------------A_CHAMP_C_ID---------------------------------------------------------------------------------------
        CASE     WHEN NEW.vue.alias_champC1+champC2= "valeurC1_1-valeurC2_1" THEN UPDATE tablesA SET A_champC_id=1 WHERE A_champC_id=OLD.A_champC_id;
                 WHEN NEW.vue.alias_champC1+champC2= "valeurC1_2-valeurC2_2" THEN UPDATE tablesA SET A_champC_id=2 WHERE A_champC_id=OLD.A_champC_id;
                 WHEN NEW.vue.alias_champC1+champC2= "valeurC1_3-valeurC2_3" THEN UPDATE tablesA SET A_champC_id=3 WHERE A_champC_id=OLD.A_champC_id;
                WHEN NEW.vue.alias_champC1+champC2= "valeurC1_4-valeurC2_4" THEN UPDATE tablesA SET A_champC_id=4 WHERE A_champC_id=OLD.A_champC_id;
                WHEN NEW.vue.alias_champC1+champC2= "valeurC1_5-valeurC2_5" THEN UPDATE tablesA SET A_champC_id=5 WHERE A_champC_id=OLD.A_champC_id;
                WHEN NEW.vue.alias_champC1+champC2= "valeurC1_6-valeurC2_6" THEN UPDATE tablesA SET A_champC_id=6 WHERE A_champC_id=OLD.A_champC_id;
                 WHEN NEW.vue.alias_champC1+champC2= "valeurC1_7-valeurC2_7" THEN UPDATE tablesA SET A_champC_id=7 WHERE A_champC_id=OLD.A_champC_id;
                WHEN NEW.vue.alias_champC1+champC2= "valeurC1_8-valeurC2_8" THEN UPDATE tablesA SET A_champC_id=8 WHERE A_champC_id=OLD.A_champC_id;
                 WHEN NEW.vue.alias_champC1+champC2= "valeurC1_9-valeurC2_9" THEN UPDATE tablesA SET A_champC_id=9 WHERE A_champC_id=OLD.A_champC_id;
                 WHEN NEW.vue.alias_champC1+champC2= "valeurC1_10-valeurC2_10" THEN UPDATE tablesA SET A_champC_id=10 WHERE A_champC_id=OLD.A_champC_id;
                WHEN NEW.vue.alias_champC1+champC2= "valeurC1_11-valeurC2_11" THEN UPDATE tablesA SET A_champC_id=11 WHERE A_champC_id=OLD.A_champC_id;
                 WHEN NEW.vue.alias_champC1+champC2= "valeurC1_12-valeurC2_12" THEN UPDATE tablesA SET A_champC_id=12 WHERE A_champC_id=OLD.A_champC_id;
                 WHEN NEW.vue.alias_champC1+champC2= "valeurC1_13-valeurC2_13" THEN UPDATE tablesA SET A_champC_id=13 WHERE A_champC_id=OLD.A_champC_id;
        ELSE RETURN NULL;
        END CASE;
        IF NOT FOUND THEN RETURN NULL;
        ELSE RETURN NEW;
        END IF;      
    -------------------------------------------------------------------------------------------------------------------------------------------------------------
        RETURN NEW;   
    -------------------------------------------------------------------------------------------------------------------------------------------------------------
    -------------------------------------------------------------------------------------------------------------------------------------------------------------
    ELSIF (TG_OP='DELETE')THEN
    -------------------------------------------------------------------------TABLE_A-----------------------------------------------------------------------------
        DELETE FROM tableA WHERE       
                    A_id= OLD.A_id                           AND    A_date_modif=OLD.A_date_modif    AND    A_champ1=OLD.A_champ1        AND
                    A_champ2=OLD.A_champ2                AND    A_champ3=OLD.A_champ3           AND       A_champ4=OLD.A_champ4         AND
                    A_champ5=OLD.A_champ5                AND    A_champ6=OLD.A_champ6        AND    A_champ7=OLD.A_champ7        AND   
                    A_champ8=OLD.A_champ8                AND    A_champ9=OLD.A_champ9        AND    A_champ10=OLD.A_champ10    AND
                    A_longueur=OLD.A_longueur                AND    A_champ11=OLD.A_champ11    AND    A_champ12=OLD.A_champ12    AND   
                    A_champ13=OLD.A_champ13    ;       
    -------------------------------------------------------------------------A_CHAMP_B_ID----------------------------------------------------------------------------
        DELETE FROM tableA WHERE A_champB_id=OLD.A_champB_id AND A_champB_id =champB_id AND A_id=OLD.A_id;
        IF NOT FOUND THEN RETURN NULL;END IF;

    -----------------------------------------------------------------------A_CHAMP_C_ID------------------------------------------------------------------------
        DELETE FROM tableA WHERE A_champC_id=OLD.A_champC_id AND tA_champC_id =champC_id  AND A_id=OLD.A_id;
        IF NOT FOUND THEN RETURN NULL;END IF;
    --------------------------------------------------------------------------------------------------------------------------------------------------------------
        RETURN NULL;   
    --------------------------------------------------------------------------------------------------------------------------------------------------------------
    --------------------------------------------------------------------------------------------------------------------------------------------------------------
    END IF;
    RETURN NULL;
END;
$$
LANGUAGE plpgsql;

CREATE TRIGGER test_maj
INSTEAD OF INSERT OR UPDATE OR DELETE
ON vue
FOR EACH ROW
EXECUTE PROCEDURE test_maj();

#5 Re : PL/pgSQL » Mise à jour de plusieurs tables à l'aide d'un seule vue » 18/08/2016 14:23:15

J'ai testé sur Qgis mais il y a un problème, il me remplit un champ integer avec du texte donc ça ne fonctionne pas.
De plus, même si la fonction fonctionnait, il faudrait refaire les manipulations pour chaque champ dès que l'on change de projet/document.


N'y a t il pas un moyen en passant par une fonction puis un trigger pour automatiser tout ça?

#6 Re : PgAdmin3 » restriction par un champ de ce que voit un utilisateur » 17/08/2016 16:38:02

L'organisme est actuellement en 9.4 mais peut être pourrons nous l'upgrader si ce n'est pas possible autrement


Oui j'ai vu ça lors de mes recherches et , par curiosité, j'avais tenté cette méthode (après avoir installer la 9.5 en localhost) mais je n'ai pas réussi à la faire fonctionner


ALTER TABLE objet ENABLE ROW LEVEL SECURITY;
CREATE POLICY test_restriction ON objet TO "utilisateur"
USING (obj_com_insee = (SELECT obj_com_insee FROM objet WHERE obj_com_insee=79000))



Je n'ai pas de message d'erreur mais au niveau du résultat l'utilisateur ne voit aucune ligne de la table ni sa géométrie (j'utilise postgis et qgis )

#7 PgAdmin3 » restriction par un champ de ce que voit un utilisateur » 17/08/2016 16:07:47

c che
Réponses : 2

Bonjour,


J'ai créé ma base de données sous postgres
avec des tables objets et une table commune


table objet1 (obj_id, obj_champ, obj_com_insee)
table commune (com_insee, com_nom)


et je souhaite savoir s'il est possible de faire en sorte qu'un utilisateur puisse uniquement voir/modifier/créer/supprimer les objets qui appartiennent à sa commune.


Dois-je passer par une fonction (avec des fonctions if et/ou case when) ou bien par autre chose?


Merci d'avance,
c.che

#8 Re : PL/pgSQL » vues:remplir 2 champs avecla même colonne etdes conditions différentes » 16/08/2016 16:35:04

Ça fonctionne à la perfection. Merci beaucoup smile


J'ai juste une petite question concernant la compréhension du code

A quoi correspondent cur. et ex. 
Est-ce que ce sont des fonctions ou bien des alias?

#9 Re : PL/pgSQL » vues:remplir 2 champs avecla même colonne etdes conditions différentes » 16/08/2016 14:15:03

" Est-ce qu'une contrainte empêche l'insertion de plus de deux gestionnaires"


Non, il n'y a pas de contraintes particulières


"Dans le second cas, le problème arrivera un jour ou l'autre."


Non, ça ne devrait pas arriver car on a choisi d'historiser uniquement l'ex_gestionnaire le plus récent.

#10 Re : PL/pgSQL » vues:remplir 2 champs avecla même colonne etdes conditions différentes » 16/08/2016 09:37:11

Dois-je passer par une fonction pour avoir les 2 informations dans un seul enregistrement ?

#11 Re : PL/pgSQL » vues:remplir 2 champs avecla même colonne etdes conditions différentes » 09/08/2016 09:06:53

On a pas à historiser autant de gestionnaire, on a juste besoin d'avoir 1 seul gestionnaire et 1 seul ex_gestionnaire.
Du coup est-ce possible? et si oui, comment faire?

#12 Re : PL/pgSQL » vues:remplir 2 champs avecla même colonne etdes conditions différentes » 08/08/2016 17:05:38

Cette technique marche très bien (je viens de la tester smile)  . Mon seul problème maintenant c'est qu'elle duplique l'objet dans ma vue.


Pour être plus claire, j'ai une ligne obj1 avec le gestionnaire et une ligne obj1 avec l'ex_gestionnaire. Faut-il modifier les case when pour avoir une seule entrée obj1 avec gestion et ex_gestion sur la même ligne?
Dans ma table" gestion_objet" j'ai :
geob_obj_id;geob_ges_id;geob_date_debut;geob_date_fin
1;1;2010-10-10;null                             (→ gestionnaire actuel)
1;2;1974-10-10;2010-10-10                  (→ancien gestionnaire)


Ce que je souhaite obtenir dans ma vue :

obj_id; obj_gestionnaire; obj ex_gestionnaire
1; syndicat1 ; commune2


(Désolée si ma question parait toute bête mais je débute en SQL)


En tout cas merci pour ta réponse rapide et efficace (thumbs up), elle me fait faire un bon en avant smile

#13 Re : PL/pgSQL » vues:remplir 2 champs avecla même colonne etdes conditions différentes » 08/08/2016 14:27:41

Dans mon MCD, la relation entre ma table "objet" et ma table "gestion" est 1,N/0,N la table "gestion_objet" est la table qui résulte de l'association entre les 2.


Cette table a comme clés primaires/étrangères les id de la table "objet"(qui contient toutes les données de l'objet) et de la table "gestion"(qui contient uniquement les noms des différents gestionnaires possibles) plus un champ date de début et un champ date de fin de la gestion.


S'il y a une date de fin pour une entrée dans la table "gestion_objet" alors cette entrée dois être visible uniquement dans le champ EX_GESTION de ma vue, si ce n'est pas le cas alors il doit être visible uniquement dans le champ GESTION de ma vue.


Est-ce possible dans cette configuration ou bien faut-il que je fasse autrement?


C.che

#14 PL/pgSQL » vues:remplir 2 champs avecla même colonne etdes conditions différentes » 08/08/2016 10:17:17

c che
Réponses : 12

Bonjour,


J'ai :


-une table gestion (ges_id, ges_nom)
-une table objet (obj_id, obj_nom)
-une table gestion_objet (geob_ges_id, geob_obj_id, geob_date_debut, geob_date_fin) qui lie les deux tables précédentes entre elles


Je souhaite créer une vue qui contient un champ gestion et un champ ex_gestion qui vont tous les deux puiser l'information dans ges_nom. la différence entre ex_gestion et gestion est que le premier à une date de fin remplit alors que l'autre non. Comment puis-je paramétrer la vue pour que ex_gestion et gestion contiennent les bons gestionnaires ?


Pour l'instant j'ai :


SELECT obj_id, obj_nom, ges_nom AS gestion, ges_nom AS ex_gestion
FROM objet, gestion_objet, gestion
WHERE (obj_id=geob_obj_id) AND (ges_id=geob_ges_id) AND
CASE gestion WHEN(trge_date_fin >0) THEN Ex_GESTION=gestion.ges_nom    WHEN(trge_date_fin =0) THEN GESTION=gestion.ges_nom
WHEN trge_date_fin IS NULL THEN GESTION=gestion.ges_nom
END;


Bien évidemment cette technique ne fonctionne pas, comment dois-je m'y prendre?


Je n'ai pas trouvé de solutions sur internet mais peut être n'ai-je pas les bons mots clés.


Merci d'avance pour vos réponses,


c.che


PS: J'ai la version 2.0 de Postgis, 9.5.3 de Postgres et 2.14.1 de Qgis

PPS: J'espère avoir été suffisamment précise mais n'hésitez pas à me faire signe si ce n'est pas le cas

#15 Re : PL/pgSQL » Mise à jour de plusieurs tables à l'aide d'un seule vue » 04/08/2016 14:18:32

N'y a-t-il pas un moyen de gérer ça avec postgres? Ce serait plus pratique pour nous, notamment quand nous devrons passer en Websig.

#16 Re : PL/pgSQL » Mise à jour de plusieurs tables à l'aide d'un seule vue » 04/08/2016 08:57:10

Par application parlez-vous d'un trigger ou bien de QGIS/Postgis/Postgres ? Comment doit on la paramétrer pour qu'elle le fasse ?


c.che

#17 Re : PL/pgSQL » Mise à jour de plusieurs tables à l'aide d'un seule vue » 03/08/2016 12:17:02

Je souhaite que les utilisateurs, à partir de la vue, puissent mettre à jour la table tronçon (ou d'autres par la suite). Le problème c'est que, au niveau des clés étrangères, il faut rentrer des chiffres qui correspondent aux différentes entrées dans les tables annexes, mais les utilisateurs ne savent pas directement quel chiffre correspond à quel entrée.


Par exemple, pour une table annexe matériau, il faut qu'ils aient juste à choisir l'élément  "PVC" et non le chiffre 12 contenu dans la clé étrangère lorsqu'ils mettent à jour la table tronçon,
mais que ce soit bien l'entrée 12 qui s'inscrive dans la colonne de la clé étrangère dans ma table tronçon.


c.che
PS: J'ai la version 2.0 de Postgis, 9.5.3 de Postgres et 2.14.1 de Qgis
PPS: J'espère avoir été suffisamment précise mais n'hésitez pas à me faire signe si ce n'est pas le cas

#18 Re : PL/pgSQL » Mise à jour de plusieurs tables à l'aide d'un seule vue » 02/08/2016 10:34:51

J'ai essayé de faire un trigger mais j'ai un problème avec ma fonction (je suis débutante en fonction sql)


Voici ma vue :


CREATE OR REPLACE VIEW aep.canalisation AS


SELECT     troncon.tro_id,
                materiau.mat_type,
                troncon.tro_phi_int,
                troncon.tro_phi_ext,
                troncon.tro_dn,
                pression_n.prn_valeur,
                troncon.tro_geom

FROM aep.troncon,
    aep.materiau,
    aep.pression_n

WHERE troncon.tro_mat_id = materiau.mat_id AND troncon.tro_prn_id = pression_n.prn_id;


et voici la fonction trigger que j ai tenté :


CREATE OR REPLACE FUNCTION vue_del_troncon() RETURNS TRIGGER AS $vue_del_troncon$
BEGIN
    IF (TG_OP = 'DELETE') THEN
   
        DELETE FROM aep.troncon WHERE tro_phi_int = OLD.tro_phi_int;
        IF NOT FOUND THEN RETURN NULL; END IF;
        DELETE FROM aep.troncon WHERE tro_phi_ext = OLD.tro_phi_ext;
        IF NOT FOUND THEN RETURN NULL; END IF;
        DELETE FROM aep.troncon WHERE tro_dn= OLD.tro_dn;
        IF NOT FOUND THEN RETURN NULL; END IF;
        DELETE FROM aep.troncon WHERE tro_geom = OLD.tro_geom;
        IF NOT FOUND THEN RETURN NULL; END IF;

        ON DELETE to canalisation.mat_type DO INSTEAD delete from aep.troncon WHERE tro_mat_id = OLD.tro_mat_id;
        ON DELETE to canalisation.prn_valeur DO INSTEAD delete from aep.troncon WHERE tro_prn_id = OLD.tro_prn_id;
       
    END IF;
    return null;
END;
$vue_del_troncon$
LANGUAGE plpgsql;


CREATE TRIGGER maj_canalisation
INSTEAD OF INSERT OR UPDATE OR DELETE
ON aep.canalisation
FOR EACH ROW
EXECUTE PROCEDURE vue_del_troncon();


Mon problème vient de ON DELETE DO INSTEAD qui apparemment n'est fait que pour les règles, mais, n'y a t-il pas un équivalent pour les fonctions ?
Ou bien suis-je partie sur une mauvaise piste?

#19 PL/pgSQL » Mise à jour de plusieurs tables à l'aide d'un seule vue » 29/07/2016 15:48:09

c che
Réponses : 18

Bonjour,

J'ai créé une base de données postgres/postgis avec :
TableA champA_id, champA1, champA2, champA_champB_id (clé étrangère), champA_geom

TableB champB_id, champB1

J'ai ensuite créer une vue avec comme définition :
SELECT champA_id, champA1, champA2, champB1, champA_geom
FROM TableA, TableB
WHERE TableA.champA_champB_id = TableB.champB_id

J'aimerai que mes tables soient mises à jour à partir de la vue via QGIS.
J'ai trouvé comment mettre à jour une seule table à partir de la vue (avec une règle).
Mais je suis coincé par les clés étrangères quand ma vue contient plusieurs table puisque je souhaite qu'en fonction de la valeur remplie dans le champB1 ma clé étrangère se remplisse automatiquement avec la valeur correspondante.


Est-ce possible et si oui, comment dois-je procéder?

Je n'ai pas trouvé de solutions sur internet mais peut être n'ai-je pas les bons mots clés.

Merci d'avance pour vos réponses,

c.che

PS: J'ai la version 2.0 de Postgis, 9.5.3 de Postgres et 2.14.1 de Qgis

PPS: J'espère avoir été suffisamment précise mais n'hésitez pas à me faire signe si ce n'est pas le cas

Pied de page des forums

Propulsé par FluxBB