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 29/02/2016 14:43:36

ari_gold
Membre

Trigger sur vue

Bonjour,
Je suis nouveau sur le site et je m'excuse par avance si mon message n'est pas posté au bon endroit ou si la question a dèjà été posée.

J'aimerie faire un trigger dans postgresql sur une vue de manière à obtenir une table identique à la vue.
Je débute avec les triggers et je ne sais pas si ce que je demande est le meilleur moyen d'obtenir ce que je souhaite.

Pour vous éclairer sur ma demande je vous joint le script pour créer les tables et la vue ainsi que le trigger que je tente de faire:

CREATE TABLE auteur
(
num_auteur integer NOT NULL,
nom_auteur character varying (50),
prenom_auteur character varying (50),
telephone_auteur character varying (10),
num_editeur integer,
CONSTRAINT pk_auteur PRIMARY KEY (num_auteur),
CONSTRAINT fk_editeur FOREIGN KEY (num_aediteur),
REFERENCES editeur (num_editeur) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
);

CREATE TABLE editeur
(
num_editeur integer NOT NULL,
nom_editeur character varying (50),
tarif_editeur integer,
CONSTRAINT pk_editeur PRIMARY KEY (num_editeur)
);


CREATE VIEW v_auteur_editeur AS
SELECT
auteur.num_auteur,
auteur.nom_auteur,
auteur.prenom_auteur,
auteur.telephone_auteur,
editeur.nom_editeur,
editeur.tarif_editeur
FROM
auteur, editeur
WHERE
auteur.num_editeur=editeur.num_editeur;


CREATE TABLE t_auteur_editeur
(
num_auteur integer NOT NULL,
nom_auteur character varying (50),
prenom_auteur character varying (50),
telephone_auteur character varying (10),
nom_editeur character varying (50),
tarif_editeur integer,
CONSTRAINT pk_auteur_editeur PRIMARY KEY (num_auteur)
);


CREATE OR REPLACE FUNCTION fn_auteur_editeur()
RETURNS TRIGGER AS
$BODY$
BEGIN
IF (TG_OP='INSERT') THEN
      INSERT INTO t_auteur_editeur (
           num_auteur,
           nom_auteur,
           prenom_auteur,
           telephone_auteur,
           nom_editeur,
           tarif_editeur
      )
      VALUES (
           NEW.num_auteur,
           NEW.nom_auteur,
           NEW.prenom_auteur,
           NEW.telephone_auteur,
           NEW.nom_editeur,
           NEW.tarif_editeur
      );
      RETURN NEW; 
END IF;

IF (TG_OP='DELETE') THEN
      DELETE FROM t_auteur_editeur  WHERE num_auteur =  OLD.num_auteur;
      RETURN OLD;
END IF;

IF (TG_OP='UPDATE') THEN
      UPDATE t_auteur_editeur
      SET
           num_auteur = NEW.num_auteur,
           nom_auteur = NEW.nom_auteur,
           prenom_auteur = NEW.prenom_auteur,
           telephone_auteur = NEW.telephone_auteur,
           nom_editeur = NEW.nom_editeur,
           tarif_editeur = NEW.tarif_editeur
      WHERE num_auteur=OLD.num_auteur;
      RETURN NEW;
END IF;
END;
$BODY$
LANGUAGE plpgsql


CREATE TRIGGER tr_auteur_editeur
      INSTEAD OF INSERT OR DELETE OR UPDATE
      ON v_auteur_editeur
      FOR EACH ROW
      EXECUTE PROCEDURE fn_auteur_editeur();


Voila en bref en souhaite avoir une table qui joigne les infos de la table auteur et de la table éditeur à l'image de la vue v_auteur_editeur,
Cependant le trigger ne met pas la table t_auteur_editeur à jour quand je modifie la table auteur.

Pouvez vous me dire si ma démarche est la bonne? et si oui comment adapter ma fonction pour que cela marche?
Merci par avance pour votre aide.

pgAdmin3 , W7.

Hors ligne

#2 29/02/2016 15:03:59

ruizsebastien
Membre

Re : Trigger sur vue

Bonjour,

Et pourquoi ne pas faire une vue materialisée ?

Cordialement.

Hors ligne

#3 29/02/2016 15:10:46

ari_gold
Membre

Re : Trigger sur vue

Bonjour,
Merci pour votre réponse,
Je sais pas ce qu'est une vue matérialisée, est ce comparable à une table car je doit avoir mon résultat dans une table obligatoirement...

Dernière modification par ari_gold (29/02/2016 15:16:00)

Hors ligne

#4 29/02/2016 15:26:56

ruizsebastien
Membre

Re : Trigger sur vue

Les vues matérialisées dans PostgreSQL™ utilisent le système des règles, tout comme les vues, mais les résultats persistent sous la forme d'une table.

La suite à lire ici :
http://docs.postgresql.fr/9.4/rules-mat … views.html

Hors ligne

#5 29/02/2016 15:37:43

ari_gold
Membre

Re : Trigger sur vue

D'accord je viens de tester sur ma base, le soucis est que l'on perd le côté dynamique de la vue puisque la vue matérialisée ne se met pas à jour automatiquement, aurait tu une solution à ce problème?
merci

Hors ligne

#6 29/02/2016 15:39:03

ruizsebastien
Membre

Re : Trigger sur vue

oui bien sûr : tu place le REFRESH MATERIALIZED VIEW dans un trigger after update sur tes 2 tables.
Ca devrait marcher comme ça.

Hors ligne

#7 29/02/2016 15:50:03

ari_gold
Membre

Re : Trigger sur vue

Bon mauvaise nouvelle, le logiciel que j'utilise ne trouve pas la vue matérialisée (alors qu'il trouve les vues mais ne peut les utilisées...), c'est bien ce que je craignais.
Mon premier post semble donc être la solution (?) car je suis obligé d'avoir toutes mes données dans une table pour pouvoir les utilisées, sachant que le logiciel que j'utilise ne permet pas de faire de jointures entre les données.
Ma première question reste donc d'actualité.
Merci

Dernière modification par ari_gold (29/02/2016 15:58:50)

Hors ligne

#8 29/02/2016 20:00:06

edlm
Membre

Re : Trigger sur vue

Bonsoir,


bizarre ce logiciel... ;-)


Si les vues ne peuvent pas être utilisées (et peut être même si elles le pouvaient - rafraîchir la vue matérialisée à chaque update sur les tables sources n'est peut être pas une bonne idée - à voir)
je pencherais plutôt vers une solution où les triggers sont posés sur les tables sources auteur et editeur et non pas sur la vue v_auteur_editeur car, si je
comprends bien, il s'agit de substituer une table à la vue actuelle. Donc pas la peine de se compliquer la vie en partant d'une vue qui n'est pas la source de l'information.
En plus poser des triggers sur une vue me paraît bien plus compliqué que sur une table.


Sauf si la vue est ce qui est utilisé pour mettre à jour les données et que ce fait n'est pas modifiable (codé dans l'application sur laquelle on n'a pas la main).


Éric

Hors ligne

#9 01/03/2016 09:38:30

ari_gold
Membre

Re : Trigger sur vue

Bonjour,

Pour le logiciel il s'agit de geoconcept web, la version web de geoconcept comme son nom l'indique. Cette version ne prend pas les vues alors que la version bureautique le fait, ce qui etait trés prartique, et je me retrouve bien embêté maintenant qu'il faut s'en passer.

Si je voulais passer par des vues avant de faire le trigger c'etait pour éviter de faire les jointures dans les triggers car je me retrouve avec des noms de colonnes ambigus..


Merci pour votre aide.

Dernière modification par ari_gold (01/03/2016 09:42:14)

Hors ligne

Pied de page des forums