Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#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
#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
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 ) . 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
#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
Pages : 1