From: | fabien <fabien(at)tigrou3tac(dot)org> |
---|---|
To: | pgsql-fr-generale(at)postgresql(dot)org |
Subject: | problème sur un champ inet dans une table partitionnée |
Date: | 2006-09-04 15:20:29 |
Message-ID: | 44FC443D.20301@tigrou3tac.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-fr-generale |
Bonjour,
je rencontre un souci avec un champ inet dans une table partitionnée.
L'objectif de ma recherche est de créer dynamiquement (trigger appelant
une procédure PL/pgsql) les tables filles et tous les index /
contraintes / règles associées (les tables filles, correspondant à un
mois de l'année, seront amenées à stocker environ 2 millions
d'enregistrement).
J'ai un champ inet dans ma table mère, mais lorsque j'exécute un
insert sur la table partitionnée (la table fille correspondante
n'existant pas), j'obtiens une erreur "ERREUR: L'opérateur n'existe pas
: text || inet"
j'ai essayé toutes les solutions possibles (où du moins celles que je
connaissais : transtypage avec ::inet, déclaration d'une variable ip
inet afin d'être initialisé avec la valeur NEW.remote_addr, ...) sans
aucun résultat, la seule solution trouvée est de remplacer le champ inet
par un champ text. Ceci reste fonctionnel mais me laisse insatisfait.
Peut être que j'ai laissé passer un/plusieurs bugs dans le code suivant,
c'est mon premier trigger/procédure pl/pgsql
définition de la table partitionnée + trigger + ...
CREATE TABLE log_audiotel ( date timestamp not null, remote_addr inet);
CREATE OR REPLACE FUNCTION log_audiotel_init_table() RETURNS trigger AS
$check_table_exist$
DECLARE
data text := NEW.date;
mois text;
mois_suivant text;
annee text;
table_exists integer;
BEGIN
EXECUTE 'SELECT to_char(EXTRACT (MONTH FROM DATE ''' || data || '''
),''FM00'')' INTO mois;
EXECUTE 'SELECT EXTRACT (YEAR FROM DATE ''' || data || ''' )' INTO annee;
EXECUTE 'SELECT count(*) FROM pg_tables WHERE tablename =
''log_audiotel_' || annee || '_' || mois || '''' INTO table_exists;
IF table_exists = 0 THEN
EXECUTE 'SELECT to_char(EXTRACT (MONTH FROM DATE ''' || data || ''' )
+ 1 ,''FM00'')' INTO mois_suivant;
EXECUTE 'CREATE TABLE log_audiotel_' || annee || '_' || mois || ' (
CHECK ( date >= DATE ''' || annee || '-' || mois || '-01'' AND date <
DATE ''' || annee || '-' || mois_suivant || '-01'' ) ) INHERITS
(log_audiotel)';
EXECUTE 'CREATE RULE log_audiotel_insert_' || annee || '_' || mois ||
' AS ON INSERT TO log_audiotel WHERE ( date >= DATE ''' || annee || '-'
|| mois || '-01'' AND date < DATE ''' || annee || '-' || mois_suivant ||
'-01'' ) DO INSTEAD INSERT INTO log_audiotel_' || annee || '_' || mois
|| ' VALUES (NEW.date,NEW.remote_addr) ';
EXECUTE 'CREATE INDEX log_audiotel_' || annee || '_' || mois ||
'_date_index ON log_audiotel_' || annee || '_' || mois || ' (date) ';
EXECUTE 'INSERT INTO log_audiotel_' || annee || '_' || mois || '
VALUES ( TIMESTAMP ''' || NEW.date || ''',''' || NEW.remote_addr || ''')';
RETURN NULL;
ELSE
RETURN NEW;
END IF;
END;
$check_table_exist$ LANGUAGE plpgsql;
CREATE TRIGGER log_audiotel_check_table BEFORE INSERT ON log_audiotel
FOR EACH ROW EXECUTE PROCEDURE log_audiotel_init_table();
voici un insert permettant de mettre en évidence l'erreur:
INSERT INTO log_audiotel VALUES ('2004-09-27 14:21:04','62.104.222.81');
Bug de mon code, souci d'implémentation, ... ?
J'attends vos avis et peut être une solution afin de pouvoir utiliser ce
champs inet
From | Date | Subject | |
---|---|---|---|
Next Message | Daniel Verite | 2006-09-05 22:02:53 | Re: problème sur un champ |
Previous Message | Jean-Max Reymond | 2006-08-31 06:49:12 | PostgreSQL disponible sur les pages perso de Free |