Vous n'êtes pas identifié(e).
Pages : 1
Bonjour à tous,
Je commence à prendre en main Postgresql, qui me satisfait en tout points jusqu'ici, je tiens donc tout d'abord à remercier toute la communauté pour ce travail.
Ma question:
Sur une vue comportant des jointures, j'essaye d'ajouter des règles afin de pouvoir la rendre modifiable.
Je bute sur l'ajout d'une clause returning dans la règle sur INSERT.
Voici le code de cette règle:
CREATE OR REPLACE RULE personne_ins AS
ON INSERT TO personnes DO INSTEAD ( INSERT INTO addresses (id, location, line_1, line_2, line_3, code_postal, ville)
VALUES (DEFAULT, 'Principale'::character varying, new.line_1, new.line_2, new.line_3, new.code_postal, new.ville);
INSERT INTO emails (id, name, address)
VALUES (DEFAULT, 'Principal'::character varying, new.address);
INSERT INTO actors (id, id_quality, main_address, main_email)
VALUES (DEFAULT, new.id_quality, currval('adresses_id_seq'::regclass), currval('emails_id_seq'::regclass));
INSERT INTO persons (id, name, firstname, birthday, prefixe)
VALUES (currval('actors_id_seq'::regclass), new.name, new.firstname, new.birthday, new.prefixe);
INSERT INTO actors_addresses (id_actor, id_address)
VALUES (currval('actors_id_seq'::regclass), currval('adresses_id_seq'::regclass));
INSERT INTO actors_emails (id_actor, id_email)
VALUES (currval('actors_id_seq'::regclass), currval('emails_id_seq'::regclass));
RETURNING
SELECT actors.id, actors.id_quality, persons.prefixe, persons.firstname,
persons.name, persons.birthday, emails.id AS main_email, emails.address,
addresses.id AS main_address, addresses.line_1, addresses.line_2,
addresses.line_3, addresses.code_postal, addresses.ville
FROM actors
JOIN persons ON persons.id = actors.id
JOIN addresses ON addresses.id = actors.main_address
JOIN emails ON emails.id = actors.main_email
WHERE actors.id = currval('actors_id_seq'::regclass);
);
Et le message d'erreur de syntaxe:
ERROR: syntax error at or near "RETURNING"
LINE 15: RETURNING
Comment ajouter correctement cette clause, ou est-ce préférable dans ce cas d'utiliser un trigger?
D'avance merci,
François
Hors ligne
Bonjour,
depuis la version 9.1 vous pouvez utiliser des triggers sur des vues, ce qui est bien plus conseillé que l'utilisation de règles.
RETURNING est une clause pour les requêtes de type insert,update et delete pas un ordre à part entière. Je ne vois d'ailleurs pas trop ce que vous cherchez à faire exactement.
Julien.
https://rjuju.github.io/
Hors ligne
Merci pour cette réponse rapide.
Je cherchais pouvoir supporter une clause returning dans les inserts sur la vue, ainsi indiqué dans la doc:
Si vous voulez supporter les requêtes RETURNING sur la vue, vous devrez faire en sorte que les règles incluent les clauses RETURNING qui calcule les lignes de la vue. Ceci est assez simple pour des vues sur une seule table mais cela devient rapidement complexe pour des vues de jointure comme lacet.
L'exemple cité dans la doc ne comportait qu'un seul insert, mais sachant qu'on pouvait avoir plusieurs commandes dans le DO d'une règle je pensais que dans le cas d'une règle on pouvait utiliser un returning global. Apparemment on ne peut pas...
En général, sur un nouvel outil, j'essaye d'en cerner le fonctionnement.
C'est fait pour cette question, merci.
François
Hors ligne
Pages : 1