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 19/06/2009 16:17:58

yenfou2000
Membre

Modification de vue avec les régles SQL

Bonjour,
Je souhaiterais faire des "insert" sur une vue que j'ai créée auparavant.
Pour cela, j'ai crée une régle ON INSERT sur la vue :
CREATE RULE new10 AS ON INSERT TO BDALK_V75  DO  insert into BDALK_V75 (T237_ID, CONTRIB_ID, CONTRIB_PWD, T237_DATE) values (10, 1, 'mdpoi', now())
Jusqu'ici tout se passe bien, la regle s'est correctement ajoutée.

Mon problème : comment utiliser cette régle ?
J'ai essayé : INSERT INTO BDALK_V75 (T237_ID, CONTRIB_ID, CONTRIB_PWD, T237_DATE) VALUES (22, 33, 'mmm', now()) mais il y a un message d'erreur : récursion indéfinie détectée. J'ai pas très bien compris l'utilisation des règles, je crois.
Pouvez vous m'éclaircir ce point ?

Hors ligne

#2 19/06/2009 16:37:49

gleu
Administrateur

Re : Modification de vue avec les régles SQL

La règle permet de dire que, si le moteur intercepte un INSERT sur la vue, l'INSERT doit se faire sur la table. Donc, la requête de création de la règle devrait plutôt être :

CREATE RULE new10 AS ON INSERT TO nom_de_la_vue  DO  insert into nom_de_la_table (col1_table, col2_table, col3_table) values (col_vue_correspondant_a_col1_table, col_vue_correspondant_a_col2_table, col_vue_correspondant_a_col3_table)

Guillaume.

Hors ligne

#3 19/06/2009 16:53:22

yenfou2000
Membre

Re : Modification de vue avec les régles SQL

Ah ok, je comprend mieux. C'est vrai, c'est logique. La vue est une table virtuelle,

Hors ligne

#4 19/06/2009 17:04:42

yenfou2000
Membre

Re : Modification de vue avec les régles SQL

par contre je n'ai aucun moyen de savoir a l'avance les tables concernées par la vue.
Y aurait il un moyen de connaitre les colonnes uniquement grace à une vue ?

Hors ligne

#5 19/06/2009 17:16:12

gleu
Administrateur

Re : Modification de vue avec les régles SQL

J'avoue que je ne comprends pas votre question. Vous pouvez détailler un peu votre cas d'utilisation ?


Guillaume.

Hors ligne

#6 19/06/2009 17:42:08

yenfou2000
Membre

Re : Modification de vue avec les régles SQL

voila : j'ai une vue (avec des jointures sur plusieurs tables) et quand je l'execute j'obtiens une table avec des informations.
Ensuite a partir de cette table virtuelle, je souhaiterais y rajouter des informations comme un insert sur une table virtuelle

Hors ligne

#7 19/06/2009 19:30:14

Marc Cousin
Membre

Re : Modification de vue avec les régles SQL

On peut écrire plusieurs règles INSTEAD sur in INSERT, un UPDATE, un DELETE sur une vue  :
http://www.postgresql.org/docs/8.3/inte … pdate.html (voir surtout la note de bas de page de Jamie Pate, que je trouve très pertinente)


Marc.

Hors ligne

#8 22/06/2009 10:03:21

yenfou2000
Membre

Re : Modification de vue avec les régles SQL

J'ai compris cette règle en bas de page.

Mais ça ne résoud pas mon problème : en fait je veux pouvoir faire un insert sur un vue.
Je me suis dit qu'il était peut être possible de le faire avec les règles.
Avez vous une idée ?

Hors ligne

#9 22/06/2009 11:00:17

Marc Cousin
Membre

Re : Modification de vue avec les régles SQL

C'est ce qu'explique la règle en bas de page : comment faire des règles sur une vue comportant des jointures


Marc.

Hors ligne

#10 22/06/2009 11:02:12

yenfou2000
Membre

Re : Modification de vue avec les régles SQL

gleu a écrit :

La règle permet de dire que, si le moteur intercepte un INSERT sur la vue, l'INSERT doit se faire sur la table. Donc, la requête de création de la règle devrait plutôt être :
     JE CROYAIS QU'ON POUVAIT PAS FAIRE DE INSERT SUR UNE VUE ????


CREATE RULE new10 AS ON INSERT TO nom_de_la_vue  DO  insert into nom_de_la_table (col1_table, col2_table, col3_table) values (col_vue_correspondant_a_col1_table, col_vue_correspondant_a_col2_table, col_vue_correspondant_a_col3_table)

Hors ligne

#11 22/06/2009 11:36:20

gleu
Administrateur

Re : Modification de vue avec les régles SQL

On peut faire des insert sur une vue à condition d'avoir une règle qui remplace cet insert par un insert dans la bonne table.


Guillaume.

Hors ligne

#12 22/06/2009 12:06:29

yenfou2000
Membre

Re : Modification de vue avec les régles SQL

Ok, mais pour déclencher l'événement.
Il faut que l'événement déclencheur de la règle soit correcte.
Syntaxiquement, insert into TABLE_VIEW_NAME .... => provoque une erreur,   donc le moteur ne pourra pas détecter la règle.

Hors ligne

#13 22/06/2009 14:21:05

gleu
Administrateur

Re : Modification de vue avec les régles SQL

Avez-vous testé ?

Voici un exemple concret qui montre que cela fonctionne :

guillaume@laptop:~$ psql postgres                                               
psql (8.4rc1)                                                                   
Saisissez « help » pour l'aide.                                                 

postgres=# create database yenfou2000;
CREATE DATABASE                       
postgres=# \c yenfou2000              
psql (8.4rc1)                         
Vous êtes maintenant connecté à la base de données « yenfou2000 ».
yenfou2000=# create table t1 (id serial, contenu text);
NOTICE:  CREATE TABLE créera des séquences implicites « t1_id_seq » pour la colonne serial « t1.id »
CREATE TABLE                                                                                        
yenfou2000=# insert into t1 (contenu) values ('ligne 1'), ('ligne 2');                              
INSERT 0 2                                                                                          
yenfou2000=# select * from t1;                                                                      
 id | contenu                                                                                       
----+---------                                                                                      
  1 | ligne 1                                                                                       
  2 | ligne 2                                                                                       
(2 lignes)                                                                                          

yenfou2000=# create view v1 as select * from t1;   
CREATE VIEW                                        
yenfou2000=# select * from v1;                     
 id | contenu                                      
----+---------                                     
  1 | ligne 1                                      
  2 | ligne 2                                      
(2 lignes)

yenfou2000=# insert into v1 (contenu) values ('ligne 3');
ERREUR:  ne peut pas insérer dans une vue
ASTUCE : Vous avez besoin d'une règle ON INSERT DO INSTEAD.
yenfou2000=# create rule insertv1 as on insert to v1 do instead insert into t1 values (default, new.contenu);
CREATE RULE
yenfou2000=# insert into v1 (contenu) values ('ligne 3');
INSERT 0 1
yenfou2000=# select * from t1;
 id | contenu
----+---------
  1 | ligne 1
  2 | ligne 2
  3 | ligne 3
(3 lignes)

yenfou2000=# select * from v1;
 id | contenu
----+---------
  1 | ligne 1
  2 | ligne 2
  3 | ligne 3
(3 lignes)

Guillaume.

Hors ligne

#14 22/06/2009 15:16:36

yenfou2000
Membre

Re : Modification de vue avec les régles SQL

Ok, cette exemple fonctionne bien, je pense pouvoir l'adapter a mon application.
Par contre, je comprend la fin de la regle :
create rule insertv1 as on insert to v1 do instead insert into t1 values (default, new.contenu);

Pk default ? Quel l'utilité du "new".

Hors ligne

#15 22/06/2009 16:45:40

gleu
Administrateur

Re : Modification de vue avec les régles SQL

Pk default ?

Parce que la colonne id est une colonne autoincrémentée sur la table. Je préfère garder ça. Maintenant, il est tout à fait possible d'indiquer NEW.id.

Quel l'utilité du "new"

NEW est le nom de la pseudo ligne à insérer. NEW.contenu correspond donc à la valeur fournie dans la clause VALUES du INSERT.


Guillaume.

Hors ligne

#16 22/06/2009 18:11:36

yenfou2000
Membre

Re : Modification de vue avec les régles SQL

gleu a écrit :

Pk default ?

Parce que la colonne id est une colonne autoincrémentée sur la table. Je préfère garder ça. Maintenant, il est tout à fait possible d'indiquer NEW.id.

Quel l'utilité du "new"

NEW est le nom de la pseudo ligne à insérer. NEW.contenu correspond donc à la valeur fournie dans la clause VALUES du INSERT.

Ok je comprend mieux merci smile
A la place de "default" est qu'on peut utiliser nextID de la sequence correspondante ? car toutes mes primary key sont basées sur des sequences. ?

Hors ligne

#17 22/06/2009 19:07:17

gleu
Administrateur

Re : Modification de vue avec les régles SQL

À priori oui. Mais le mot clé default fait la même chose. Ma colonne ID a comme valeur par défaut le résultat du nextval de la séquence associée.


Guillaume.

Hors ligne

Pied de page des forums