Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/12/2011, 10h01   #1
Nouveau Membre du Club
 
Homme
Ingénieur développement logiciels
Inscription : janvier 2005
Messages : 69
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 26
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : janvier 2005
Messages : 69
Points : 30
Points : 30
Envoyer un message via MSN à arno15
Par défaut Instead rules à l'insertion

Bonjour,

Je fait des tests afin de mettre en place un partitionnement par année d'une table sous Postgresql 8.1. La doc en ligne préconise d'utiliser les rules pour gérer les opérations d'insertion, maj et delete.

J'ai donc déclarer des règles à l'insertion sur ma table mère pour chacune des tables filles qui insèrent les données dans les tables filles.

Par exemple : La table mère est MaTable, j'ai deux tables filles : MaTable_2010 et MaTable_2011 et deux règles :
Code :
1
2
3
4
5
6
7
8
9
 
CREATE OR REPLACE RULE matable_insert_2010 AS
    ON INSERT TO MaTable
   WHERE new.annee = 2010::numeric DO INSTEAD INSERT INTO MaTable_2010 VALUES (...);
 
 
CREATE OR REPLACE RULE matable_insert_2011 AS
    ON INSERT TO MaTable
   WHERE new.annee = 2011::numeric DO INSTEAD INSERT INTO MaTable_2011 VALUES (...);
Mon problème est que lorsque j'insère une ligne dans MaTable, celle ci est bien insérée dans la bonne table fille en fonction de son année, mais également dans la table mère !

Comment faire pour que les données soit uniquement insérées dans les tables filles ???
arno15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 10h36   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 959
Points : 17 791
Points : 17 791
Lisez l'article que j'ai écrit à ce sujet : http://blog.developpez.com/sqlpro/p1...araison-postg/
mais sachez que le partitionnement dans PG est une vaste plaisanterie (pour ne pas dire de gros mot...) et qu'il vaut mieux l'éviter à tout prix, tant qu'il n'y aura pas une solution performante.

Au passage un autre article sur quand faut-il partitionner... http://blog.developpez.com/sqlpro/p9...r-ameliorer-l/

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 10h46   #3
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 654
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 654
Points : 2 656
Points : 2 656
Citation:
Envoyé par arno15 Voir le message
Mon problème est que lorsque j'insère une ligne dans MaTable, celle ci est bien insérée dans la bonne table fille en fonction de son année, mais également dans la table mère !

Comment faire pour que les données soit uniquement insérées dans les tables filles ???
Bonjour,

Pour la version 8.1 je ne saurai dire.

Par contre en 9.1 les lignes ne sont pas insérées dans la table mère si vos rule instead of sont bonnes.

Vous pouvez vérifier ceci assez facillement en regardant la taille de votre table mère qui doit être de 0.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 11h13   #4
Nouveau Membre du Club
 
Homme
Ingénieur développement logiciels
Inscription : janvier 2005
Messages : 69
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 26
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : janvier 2005
Messages : 69
Points : 30
Points : 30
Envoyer un message via MSN à arno15
Merci pour vos réponses.

La taille de la table mère ne reste pas à 0 malgré la présence d'un trigger interdisant l'insertion dans celle-ci. J'ai cependant l'impression que celui-ci n'est pas appelé.

Bref je vais investiguer un peu même si l'article posté part @SQLpro montre bien que le partitionnement postgres est un peu chaotique et me fait réfléchir sur le gain de perfs.

Merci en tout cas. @+
arno15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 15h49   #5
Modérateur
 
Inscription : octobre 2008
Messages : 1 508
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 508
Points : 2 040
Points : 2 040
Citation:
Envoyé par arno15 Voir le message
Mon problème est que lorsque j'insère une ligne dans MaTable, celle ci est bien insérée dans la bonne table fille en fonction de son année, mais également dans la table mère !
Mais pour lire la table mère après insertion, est-ce que tu mets le mot clef ONLY avant le nom de table pour ne pas avoir aussi les données des tables filles?
Le cas échéant, c'est ça le problème.
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h06.


 
 
 
 
Partenaires

Hébergement Web