Vous n'êtes pas identifié(e).
Pages : 1
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
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 ?
Marc.
Hors ligne
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
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
Pages : 1