[GENERAL] Creating rule for sliding data

Поиск
Список
Период
Сортировка
От F. BROUARD / SQLpro
Тема [GENERAL] Creating rule for sliding data
Дата
Msg-id 4E917601.4040700@club-internet.fr
обсуждение исходный текст
Ответы Re: [GENERAL] Creating rule for sliding data  ("F. BROUARD / SQLpro" <sqlpro@club-internet.fr>)
Список pgsql-sql
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 *************************



В списке pgsql-sql по дате отправления:

Предыдущее
От: Tom Lane
Дата:
Сообщение: Re: plpgsql function executed multiple times for each return value
Следующее
От: "F. BROUARD / SQLpro"
Дата:
Сообщение: Re: [GENERAL] Creating rule for sliding data