RE: [MASSMAIL]duda con particionado de tablas

From: "Esneiker Enriquez Cabrera" <eenriquez(at)cav(dot)desoft(dot)cu>
To: "'Anthony Sotolongo'" <asotolongo(at)gmail(dot)com>, "'POSTGRES'" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: RE: [MASSMAIL]duda con particionado de tablas
Date: 2015-02-20 16:41:51
Message-ID: 002c01d04d2c$20ee1cc0$62ca5640$@desoft.cu
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Las reglas están definidas de la forma:

CREATE OR REPLACE RULE estudiante_2015_insert_rule AS

ON INSERT TO historico_master.estudiante

WHERE new.anno = 2015 DO INSTEAD INSERT INTO
historico_2015.estudiante_2015 (id, nombre, anno)

VALUES (new.id, new.nombre, new.anno);

CREATE OR REPLACE RULE estudiante_2016_insert_rule AS

ON INSERT TO historico_master.estudiante

WHERE new.anno = 2016 DO INSTEAD INSERT INTO
historico_2016.estudiante_2016 (id, nombre, anno)

VALUES (new.id, new.nombre, new.anno);

Saludos,

Ing. Esneiker Enriquez Cabrera
Esp. B en Ciencias Informáticas

Desoft en Ciego de Ávila. Joaquín de Aguero esq. Calle 2. Ciego de Ávila.
Cuba.
Telf.: 53 33 22 8971, email.: eenriquez(at)cav(dot)desoft(dot)cu

De: pgsql-es-ayuda-owner(at)postgresql(dot)org
[mailto:pgsql-es-ayuda-owner(at)postgresql(dot)org] En nombre de Anthony Sotolongo
Enviado el: viernes, 20 de febrero de 2015 11:33
Para: Marcos Ortiz; Esneiker Enriquez Cabrera; 'POSTGRES'
Asunto: Re: [MASSMAIL][pgsql-es-ayuda] duda con particionado de tablas

Hola Eskeiner me sumo a lo que sugiere marcos, a lo mejor estas definiendo
mal la regla. Una cosa que debes saber es que si consultas la tabla padre
vas a ver los elementos del hijo, pero no quiere decir que estén en el padre
fisicamente, puedes probar haciendo un select * from only tabla_padre y si
esta implementada la herencia y el redireccionamiento de los registros
correctamente, la tabla padre va a estar vacía, los registros van a estar en
los hijos solamente.

saludos

On 20/02/15 12:55, Marcos Ortiz wrote:

On 20/02/15 10:18, Esneiker Enriquez Cabrera wrote:

Hola amigos.

Estoy implementando un ejemplo de partición de tablas en postgres pero me he
encontrado con un problemita. Describo mi escenario.

Estoy usando postgres 8.4 y tengo un esquema que se llama master, en este
esquema tengo una tabla que sería mi tabla padre. Tengo otro esquema que se
llama histórico 2015 que tiene una tabla que hereda de la tabla del esquema
master. Tengo creada una regla que me inserta los valores de la tabla padre
a la hija según la condición que le especifico. Esto funciona correctamente,
pero el problema está en que me inserta el registro en la tabla padre y en
la tabla hija, mientras que en los documentos que solo se debe insertar en
la tabla hija. Si elimino el registro de alguna de estas tablas lo elimina
de la otra.

Alguien me podría dar alguna sugerencia?

Muchas gracias.

Bueno, el problema debe estar en la regla que estás definiendo. Generalmente
esto se hace con un Trigger de tipo Before, para que se ejecute antes del
INSERT en la tabla master. Aquí te dejo el ejemplo de un trigger de este
tipo y su función correspondiente. La tabla master es impressions_by_day, y
cada partición tiene dos meses de datos:

CREATE TRIGGER insert_impressions_by_day_trigger
BEFORE INSERT ON impressions_by_day
FOR EACH ROW EXECUTE PROCEDURE impressions_by_day_insert_trigger();

CREATE OR REPLACE FUNCTION impressions_by_day_insert_trigger()
RETURNS TRIGGER AS $$
BEGIN
IF ( NEW.day >= DATE '2009-01-01' AND NEW.day < DATE '2009-03-01' ) THEN

INSERT INTO impressions_by_day_y2009m1ms2 VALUES (NEW.*);
ELSIF ( NEW.day >= DATE '2009-03-01' AND NEW.day < DATE '2009-05-01' )
THEN
INSERT INTO impressions_by_day_y2009m3ms2 VALUES (NEW.*);
ELSIF ( NEW.day >= DATE '2009-05-01' AND NEW.day < DATE '2009-07-01' )
THEN
INSERT INTO impressions_by_day_y2009m5ms2 VALUES (NEW.*);
ELSIF ( NEW.day >= DATE '2009-07-01' AND NEW.day < DATE '2009-09-01' )
THEN
INSERT INTO impressions_by_day_y2009m7ms2 VALUES (NEW.*);
ELSIF ( NEW.day >= DATE '2009-09-01' AND NEW.day < DATE '2009-11-01' )
THEN
INSERT INTO impressions_by_day_y2009m9ms2 VALUES (NEW.*);
ELSIF ( NEW.day >= DATE '2009-11-01' AND NEW.day < DATE '2010-01-01' )
THEN
INSERT INTO impressions_by_day_y2009m11ms2 VALUES (NEW.*);
ELSIF ( NEW.day >= DATE '2010-01-01' AND NEW.day < DATE '2010-03-01' )
THEN
INSERT INTO impressions_by_day_y2010m1ms2 VALUES (NEW.*);
ELSIF ( NEW.day >= DATE '2010-03-01' AND NEW.day < DATE '2010-05-01' )
THEN
INSERT INTO impressions_by_day_y2010m3ms2 VALUES (NEW.*);
ELSIF ( NEW.day >= DATE '2010-05-01' AND NEW.day < DATE '2010-07-01' )
THEN
INSERT INTO impressions_by_day_y2010m5ms2 VALUES (NEW.*);
ELSIF ( NEW.day >= DATE '2010-07-01' AND NEW.day < DATE '2010-09-01' )
THEN
INSERT INTO impressions_by_day_y2010m7ms2 VALUES (NEW.*);
ELSIF ( NEW.day >= DATE '2010-09-01' AND NEW.day < DATE '2010-11-01' )
THEN
INSERT INTO impressions_by_day_y2010m9ms2 VALUES (NEW.*);
ELSIF ( NEW.day >= DATE '2010-11-01' AND NEW.day < DATE '2011-01-01' )
THEN
INSERT INTO impressions_by_day_y2010m11ms2 VALUES (NEW.*);
ELSIF ( NEW.day >= DATE '2011-01-01' AND NEW.day < DATE '2011-03-01' )
THEN
INSERT INTO impressions_by_day_y2011m1ms2 VALUES (NEW.*);
ELSIF ( NEW.day >= DATE '2011-03-01' AND NEW.day < DATE '2011-05-01' )
THEN
INSERT INTO impressions_by_day_y2011m3ms2 VALUES (NEW.*);
ELSIF ( NEW.day >= DATE '2011-05-01' AND NEW.day < DATE '2011-07-01' )
THEN
INSERT INTO impressions_by_day_y2011m5ms2 VALUES (NEW.*);
ELSIF ( NEW.day >= DATE '2011-07-01' AND NEW.day < DATE '2011-09-01' )
THEN
INSERT INTO impressions_by_day_y2011m7ms2 VALUES (NEW.*);
ELSIF ( NEW.day >= DATE '2011-09-01' AND NEW.day < DATE '2011-11-01' )
THEN
INSERT INTO impressions_by_day_y2011m9ms2 VALUES (NEW.*);
ELSIF ( NEW.day >= DATE '2011-11-01' AND NEW.day < DATE '2012-01-01' )
THEN
INSERT INTO impressions_by_day_y2011m11ms2 VALUES (NEW.*);
ELSIF ( NEW.day >= DATE '2012-01-01' AND NEW.day < DATE '2012-03-01' )
THEN
INSERT INTO impressions_by_day_y2012m1ms2 VALUES (NEW.*);
ELSIF ( NEW.day >= DATE '2012-03-01' AND NEW.day < DATE '2012-05-01' )
THEN
INSERT INTO impressions_by_day_y2012m3ms2 VALUES (NEW.*);
ELSIF ( NEW.day >= DATE '2012-05-01' AND NEW.day < DATE '2012-07-01' )
THEN
INSERT INTO impressions_by_day_y2012m5ms2 VALUES (NEW.*);
ELSIF ( NEW.day >= DATE '2012-07-01' AND NEW.day < DATE '2012-09-01' )
THEN
INSERT INTO impressions_by_day_y2012m7ms2 VALUES (NEW.*);
ELSIF ( NEW.day >= DATE '2012-09-01' AND NEW.day < DATE '2012-11-01' )
THEN
INSERT INTO impressions_by_day_y2012m9ms2 VALUES (NEW.*);
ELSIF ( NEW.day >= DATE '2012-11-01' AND NEW.day < DATE '2013-01-01' )
THEN
INSERT INTO impressions_by_day_y2012m11ms2 VALUES (NEW.*);
ELSE
RAISE EXCEPTION 'Date out of range. Something wrong with the
impressions_by_day_insert_trigger() function!';
END IF;
RETURN NULL;
END;
$$
LANGUAGE plpgsql;

Saludos,

Ing. Esneiker Enriquez Cabrera
Esp. B en Ciencias Informáticas

Desoft en Ciego de Ávila. Joaquín de Aguero esq. Calle 2. Ciego de Ávila.
Cuba.
Telf.: 53 33 22 8971, email.: eenriquez(at)cav(dot)desoft(dot)cu

__________ Información de ESET NOD32 Antivirus, versión de la base de firmas
de virus 11193 (20150218) __________

ESET NOD32 Antivirus ha comprobado este mensaje.

http://www.eset.com

__________ Información de ESET NOD32 Antivirus, versión de la base de firmas
de virus 11193 (20150218) __________

ESET NOD32 Antivirus ha comprobado este mensaje.

http://www.eset.com

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Anthony Sotolongo 2015-02-20 17:26:03 Re: [MASSMAIL]duda con particionado de tablas
Previous Message Anthony Sotolongo 2015-02-20 16:33:29 Re: [MASSMAIL]duda con particionado de tablas