Skip site navigation (1) Skip section navigation (2)

Peripheral Links

Header And Logo

PostgreSQL
| The world's most advanced open source database.

Site Navigation

Search for
  Advanced Search

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



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






Home | Main Index | Thread Index

Privacy Policy | PostgreSQL Archives hosted by Command Prompt, Inc. | Designed by tinysofa
Copyright © 1996 – 2008 PostgreSQL Global Development Group