problème sur un champ inet dans une table partitionnée

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

Responses

Browse pgsql-fr-generale by date

  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