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 29/08/2006, 16h41   #1
dclink
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Par défaut Héritage et Rule..

Hello tt le monde.

J ai un petit souci, donc j ai crée une table mère, les tables filles sont crées dynamiquement avec un trigger avant un insert,update ou delete, pour ça pas de souci, le problème c est qu à la première insertion, il enregistre dans la table mère, à partir de la seconde insertion il prend bien en compte la rule qui lui dit de taper dans les tables filles donc cela voudrait dire qu à la première insertion les rules n existent pas encore ??

Merci d avance.
  Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2006, 17h40   #2
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
Bonjour,

j'ai du mal à me figurer la chose... Une description un peu plus détaillée de ta règle et de ton trigger pourrait aider...
__________________
FAQ XML
------------
« Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
Giacomo Leopardi
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2006, 17h53   #3
dclink
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Ma procédure qui crée la table + les rules qui vont bien donne en gros ceci :
Code :
1
2
3
4
5
6
7
8
 
Vérifie si la TABLE fille existe ...
Si la TABLE n'existe pas 
CREATE TABLE table || année || mois || contrainte sur la date >= premier jour du mois et < premier jour du mois suivant inherits (table mère);
CREATE UNIQUE INDEX sur le champ date;
CREATE RULE table || année || mois || _insert_rl AS ON INSERT TO table mère ||... (en fonction de la date) ... || DO INSTEAD INSERT INTO table fille etc ... 
CREATE RULE table || année || mois || _delete_rl AS ON DELETE TO table mère || ... || DO INSTEAD DELETE FROM table fille WHERE date = telledate
etc...
Comme je disais plus haut la table fille et les règles sur la table mère sont bien crées dès qu une insertion est tenté si et seulement si la table fille n existe pas, les règles sont bonnes etc ...

Le problème se situe au fait que quand je fais une insertion et que la table fille n est pas crée on dirait que PostgreSQL fait l insertion et crée les règles et la table fille ensuite ce qui fait que l enregistrement se fait dans la table mère du coup ensuite dès que je fais une seconde insertion là par contre les rules sont bien pris en compte et l enregistrement se fait bien sur la table fille ...
  Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2006, 09h18   #4
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
Citation:
Envoyé par dclink
Le problème se situe au fait que quand je fais une insertion et que la table fille n est pas crée on dirait que PostgreSQL fait l insertion et crée les règles et la table fille ensuite ce qui fait que l enregistrement se fait dans la table mère du coup ensuite dès que je fais une seconde insertion là par contre les rules sont bien pris en compte et l enregistrement se fait bien sur la table fille ...
En principe, l'action des règles s'effectue en amont de celle des triggers... Du fait que le code de création des règles se trouve dans un trigger, elles ne seront opérationnelles qu'à la fin de la transaction.

D'une manière générale, je te déconseille fortement d'employer des commandes DDL dans des fonctions trigger à cause des effets de bord indésirables et complexes à appréhender qui peuvent en résulter. Il y a forcément un moyen différent et plus « clean » d'obtenir ce que tu souhaites.
__________________
FAQ XML
------------
« Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
Giacomo Leopardi
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2006, 09h20   #5
Membre chevronné
 
Avatar de gerald2545
 
Inscription : février 2003
Messages : 643
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 643
Points : 660
Points : 660
je vais peut-être dire une connerie mais tu ne dois pas faire un commit après la création de ta table fille et de tes rules avant d'insérer dedans?
gerald2545 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2006, 09h50   #6
dclink
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
GrandFather > A moins de créer les tables et les rules d avance j ai pas trouvé d autres moyens mais ça m embeterait pas mal de créer une tache cron, sans couter le cout éventuel, il doit y avoir un autre moyen mais j ai rien trouvé sur le grand ternet

gerald2545 > Je ne pense pas d'autres avis ??
  Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2006, 10h08   #7
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
Citation:
Envoyé par dclink
GrandFather > A moins de créer les tables et les rules d avance j ai pas trouvé d autres moyens mais ça m embeterait pas mal de créer une tache cron, sans couter le cout éventuel, il doit y avoir un autre moyen mais j ai rien trouvé sur le grand ternet
Je ne saisis pas trop pourquoi il te faudrait une tâche cron pour cela.
__________________
FAQ XML
------------
« Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
Giacomo Leopardi
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2006, 10h11   #8
dclink
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Citation:
Envoyé par GrandFather
Je ne saisis pas trop pourquoi il te faudrait une tâche cron pour cela.
En fait les tables filles sont du type nomtable+annee+mois donc je pensais créer une tache cron lancée tous les 31 décembre qui créerait toutes les tables filles de l année suivante et les règles qui vont avec, en tous les cas j ai l impression qu il faut créer les tables à l avance j espère trouver un autre moyen ...
  Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2006, 11h27   #9
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
Et pourquoi tu ne crées pas une seule table utilisée en permanence, et qui intégrerait les informations mois & année dans des champs ?
__________________
FAQ XML
------------
« Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
Giacomo Leopardi
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2006, 11h42   #10
dclink
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Lol c est pas possible j ai beaucoup trop d enregistrement par mois, le partionnement s impose
  Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2006, 12h14   #11
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
Si tu dois absolument partitionner tes données dans des tables différentes, il vaut effectivement mieux détacher cette tâche d'administration dans un script Shell/SQL. Les triggers et règles ne sont pas vraiment conçus pour ce genre d'utilisation...
__________________
FAQ XML
------------
« Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
Giacomo Leopardi
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2006, 21h13   #12
dclink
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
J ai trouvé une solution qui marche dans la procédure quand la table n existe pas je rajoute une requete insert vers la table fille puis je retourne un NULL
  Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2006, 22h41   #13
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
Je suis content pour toi que cela fonctionne, mais on est pas très loin d'un vilain hack quand même...
__________________
FAQ XML
------------
« Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
Giacomo Leopardi
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2006, 22h53   #14
dclink
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Ben en l abscence de réponse même sur la ml ...
  Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Mettre Résolu
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h12.


 
 
 
 
Partenaires

Hébergement Web