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 26/12/2016 16:51:07

Fanch
Membre

Erreur Insert utilisant des vues

Bonjour,

Je suis plutôt un débutant, excusez le vocabulaire approximatif. J'ai changé d'ordinateur, et je me suis décidé à réécrire ma base de données. Sur mon ancienne machine, j'utilise des vues qui ne me posent pas de problème. Pour tester j'ai même relancé l'écriture de la base sur l'ancienne machine, aucune erreur. Depuis ma nouvelle installation, mes insert remontent cette erreur:

"DÉTAIL : Les vues qui lisent plusieurs tables ou vues ne sont pas automatiquement disponibles en écriture.
ASTUCE : Pour activer l'insertion dans la vue, fournissez un trigger INSTEAD OF INSERT ou une règle ON INSERT DO INSTEAD sans condition."

Et la vue utilisée est codée comme suit:

CREATE OR REPLACE VIEW qry_add_plot AS 
SELECT id_expe, block, plot, genotype, fungicide, nitrogen, degrain 
FROM t_block
JOIN t_plot ON t_block.id_block = t_plot.id_block
JOIN t_modality ON t_plot.id_mod = t_modality.id_mod;
CREATE OR REPLACE RULE ri_qry_add_plot AS
ON INSERT TO qry_add_plot DO INSTEAD  INSERT INTO
t_plot(id_block, plot, id_mod)
VALUES (
  fct_return_or_create_id_block(new.id_expe, new.block),
  new.plot,
  fct_return_or_create_id_mod(new.genotype, new.fungicide, new.nitrogen,
    new.degrain)
);

Comment rendre les vues automatiquement disponibles en écriture? J'aimerai éviter de toucher au code de mes vues utilisées en insertion, y a-t-il une option modifiable?

Pour ma version:
"PostgreSQL 9.4.9 on x86_64-unknown-linux-gnu, compiled by gcc (Debian 4.9.2-10) 4.9.2, 64-bit"

Merci d'avance,
François

Hors ligne

#2 26/12/2016 17:52:44

Marc Cousin
Membre

Re : Erreur Insert utilisant des vues

Je viens de vérifier, ça devrait fonctionner (je n'ai évidemment pas exactement votre schéma). Êtes vous sûr que la rule existe dans votre nouvelle base ?

Hors ligne

#3 26/12/2016 18:20:08

Fanch
Membre

Re : Erreur Insert utilisant des vues

Oui oui, la règle est bien créée. Petit détail, la règle d'insertion en exemple, et recopiées ci après, implique l'écriture simultanée dans la table t_plot, mais également dans les tables t_block et t_mod si mon block et mon mod n'existent pas encore (utilisation des fonctions fct_return_or_create_id_block, fct_return_or_create_id_mod, qui retournent ou créent les identifiants id_block et id_mod). 

CREATE OR REPLACE RULE ri_qry_add_plot AS
ON INSERT TO qry_add_plot DO INSTEAD  INSERT INTO
t_plot(id_block, plot, id_mod)
VALUES (
  fct_return_or_create_id_block(new.id_expe, new.block),
  new.plot,
  fct_return_or_create_id_mod(new.genotype, new.fungicide, new.nitrogen,
    new.degrain)
);

Une autre piste?

Hors ligne

#4 26/12/2016 19:05:40

Fanch
Membre

Re : Erreur Insert utilisant des vues

OK, au temps pour moi.
L'erreur venait de la fonction fct_return_or_create_id_mod qui attend en fait un paramètre supplémentaire.
Et Marc Cousin avait raison, la règle était du coup inexistante.
Merci pour l'aide.

Hors ligne

Pied de page des forums