Depuis la documentationhttp://www.postgresql.org/docs/8.4/ statique/règles.html
donc il réécrit d'abord les requêtes sans rien exécuter.
vous pouvez le faire fonctionner lorsque vous n'insérez pas plusieurs enregistrements à la fois :
create or replace rule ct_i_children1 as
on insert to Children1
do instead (
insert into Parents(id, attribute1, type)
values(nextval('parents_id_seq'), new.attribute1, 'Child1');
insert into Partial_Children1(id, attribute2, type)
values(currval('parents_id_seq'), new.attribute2, 'Child1');
);
Ensuite, vous pouvez faire :
insert into Children1 (attribute1, attribute2) values ('a1', 'a2');
insert into Children1 (attribute1, attribute2) values ('b1', 'b2');
mais pas
insert into Children1 (attribute1, attribute2)
values ('a1', 'a2'),
('b1', 'b2');
Donc, vous ne devriez vraiment pas utiliser le système de règles avec des appels currval() délicats.
Consultez également les commentaires sur ces pages :
- http://www.postgresql.org/docs/ 8.2/interactive/rules-update.html
- http://archives.postgresql.org/pgsql- sql/2004-10/msg00195.php
- http://archives.postgresql.org/pgsql- général/2009-06/msg00278.php
Autre conseil :le support de la liste de diffusion postgresql est aussi excellent que le moteur de base de données lui-même !
Et au fait :savez-vous que postgresql prend en charge l'héritage prêt à l'emploi ?
Résumé :vous devez utiliser des déclencheurs ou éviter les insertions de plusieurs lignes !