pg.ddx.io  pgsql-sql@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: F. BROUARD / SQLpro <sqlpro@club-internet.fr>
To: pgsql-sql@postgresql.org
Subject: [GENERAL] Creating rule for sliding data
Date: Sun, 09 Oct 2011 12:22:57 +0200
Message-ID: <4E917601.4040700@club-internet.fr> (raw)

Hello,

I have a problem to find the good syntax for a rule for rows going for 
one partition to the other in cas of an update.

Let me give the conditions :

1 - having a mother table

CREATE TABLE T_MESURE_MSR
(
   MSR_ID      INT   NOT NULL,
   MSR_DATE    DATE  NOT NULL,
   MSR_MESURE  FLOAT NOT NULL
);

2 - having 2 child table :

CREATE TABLE T_MESURE_BEFORE2000_MSR
(
CHECK ( MSR_DATE < DATE '2000-01-01')
) INHERITS (T_MESURE_MSR)

CREATE TABLE T_MESURE_AFTER1999_MSR
(
CHECK ( MSR_DATE >= DATE '2000-01-01')
) INHERITS (T_MESURE_MSR)

THE QUESTION...

How to make the proper rule for T_MESURE_MSR il a rox goes from 1998 to 
2003 ?

This one does not work :

CREATE RULE R_U_MSR_BEFORE2000
AS
ON UPDATE TO T_MESURE_MSR
    WHERE ( NEW.MSR_DATE < DATE '2000-01-01' )
DO INSTEAD
-- rows does not change partition :
   UPDATE T_MESURE_BEFORE2000_MSR
   SET MSR_ID     = NEW.MSR_ID,
       MSR_DATE   = NEW.MSR_DATE,
       MSR_MESURE = NEW.MSR_MESURE
   WHERE ( OLD.MSR_DATE < DATE '2000-01-01' );

-- rows does change partition (first INSERT NEWs then DELETE OLDs)
   INSERT INTO T_MESURE_MSR
   VALUES ( NEW.MSR_ID,
            NEW.MSR_DATE,
            NEW.MSR_MESURE )
   WHERE NOT ( OLD.MSR_DATE < DATE '2000-01-01' );

   DELETE FROM T_MESURE_MSR
   WHERE  MSR_ID = OLD.MSR_ID
     AND  MSR_DATE = OLD.MSR_DATE
     AND  MSR_MESURE = OLD.MSR_MESURE
   WHERE NOT ( OLD.MSR_DATE < DATE '2000-01-01' );


And no more for this one :

CREATE RULE R_U_MSR_BEFORE2000
AS
ON UPDATE TO T_MESURE_MSR
    WHERE ( NEW.MSR_DATE < DATE '2000-01-01' )
DO INSTEAD
-- rows does not change partition :
   UPDATE T_MESURE_BEFORE2000_MSR
   SET MSR_ID     = NEW.MSR_ID,
       MSR_DATE   = NEW.MSR_DATE,
       MSR_MESURE = NEW.MSR_MESURE
   WHERE ( OLD.MSR_DATE < DATE '2000-01-01' );

-- rows does change partition (first INSERT the NEWs then DELETE the OLDs)
   INSERT INTO T_MESURE_MSR
   SELECT MSR_ID,
          MSR_DATE,
          MSR_MESURE
   FROM   NEW
   WHERE NOT ( OLD.MSR_DATE < DATE '2000-01-01' );

   DELETE FROM T_MESURE_MSR
   WHERE  (MSR_ID, MSR_DATE, MSR_MESURE)
          IN (SELECT MSR_ID, MSR_DATE, MSR_MESURE
              FROM   OLD
              WHERE NOT ( OLD.MSR_DATE < DATE '2000-01-01' ));

Any idea ?

Thanks


-- 
Frédéric BROUARD - expert SGBDR et SQL - MVP SQL Server - 06 11 86 40 66
Le site sur le langage SQL et les SGBDR  :  http://sqlpro.developpez.com
Enseignant Arts & Métiers PACA, ISEN Toulon et CESI/EXIA Aix en Provence
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
*********************** http://www.sqlspot.com *************************




view thread (4+ messages)  latest in thread

Message-ID: <4E917601.4040700@club-internet.fr>
Permalink:  ../4E917601.4040700@club-internet.fr/
Also on:    postgresql.org/message-id/4E917601.4040700@club-internet.fr

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-sql@postgresql.org
  Cc: sqlpro@club-internet.fr
  Subject: Re: [GENERAL] Creating rule for sliding data
  In-Reply-To: <4E917601.4040700@club-internet.fr>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox