2016-08-22 6 views
1

Ich versuche, den Ratschlag here zu folgen, um eine vertikal partitionierte Tabelle zum Speichern von Zeitreihendaten zu erstellen.PostgreSQL geerbt Tabelle und Einfügen von Triggern

Bisher mein Schema wie folgt aussieht:

CREATE TABLE events 
(
    topic text, 
    t timestamp, 
    value integer, 
    primary key(topic, t) 
); 

CREATE TABLE events_2014 
(
    primary key (topic, t), 
    check (t between '2014-01-01' and '2015-01-01') 
) INHERITS (events); 

Jetzt so versuche ich, einen INSTEAD OF INSERT Auslöser zu schaffen, dass die Ereignisse auf der events Tabelle eingefügt werden können, und die Zeile wird in dem rechten Unter Ende -Tabelle. Aber die Dokumentation sagt, dass INSTEAD OF INSERT Trigger können nur auf Ansichten erstellt werden, keine Tabellen (oder Unter-Tabellen):

CREATE OR REPLACE FUNCTION insert_events() RETURNS TRIGGER AS $insert_events$ BEGIN 
    IF new.t between '2014-01-01' and '2015-01-01' THEN 
    INSERT INTO events_2014 SELECT new.*; 
    ... 
    END IF 
    RETURN NULL; 
END; 
$insert_events$ LANGUAGE PLPGSQL; 

CREATE TRIGGER insert_events INSTEAD OF INSERT ON events FOR EACH ROW EXECUTE PROCEDURE insert_events(); 
ERROR: "events" is a table 
DETAIL: Tables cannot have INSTEAD OF triggers. 

Was ist der richtige Weg, dies zu tun?

+0

Sie scheinen beim Erstellen einer untergeordneten Tabelle die Klausel "INHERITS" vergessen zu haben. –

+0

Ganz richtig, danke, jetzt bearbeitet. – Tom

Antwort

2

Sie müssen BEFORE INSERT Trigger deklarieren.

Documentation on partitioning ist eine große Quelle des Wissens in dieser Angelegenheit und ist voller Beispiele.

Beispiel Funktion von docs

CREATE OR REPLACE FUNCTION measurement_insert_trigger() 
RETURNS TRIGGER AS $$ 
BEGIN 
    IF (NEW.logdate >= DATE '2006-02-01' AND 
     NEW.logdate < DATE '2006-03-01') THEN 
     INSERT INTO measurement_y2006m02 VALUES (NEW.*); 
    ELSIF (NEW.logdate >= DATE '2006-03-01' AND 
      NEW.logdate < DATE '2006-04-01') THEN 
     INSERT INTO measurement_y2006m03 VALUES (NEW.*); 
    ... 
    ELSIF (NEW.logdate >= DATE '2008-01-01' AND 
      NEW.logdate < DATE '2008-02-01') THEN 
     INSERT INTO measurement_y2008m01 VALUES (NEW.*); 
    ELSE 
     RAISE EXCEPTION 'Date out of range. Fix the measurement_insert_trigger() function!'; 
    END IF; 
    RETURN NULL; 
END; 
$$ 
LANGUAGE plpgsql; 

Beispiel Trigger von docs

CREATE TRIGGER insert_measurement_trigger 
    BEFORE INSERT ON measurement 
    FOR EACH ROW EXECUTE PROCEDURE measurement_insert_trigger(); 

Zurückgeben NULL aus BEFORE Trigger wird die übergeordnete Tabelle leer bleiben.

+0

Perfekt, danke. – Tom

Verwandte Themen