2016-08-22 7 views
1

私は助言hereに従って、時系列データを格納するための垂直に分割されたテーブルを作成しようとしています。PostgreSQLがテーブルとインサートのトリガーを継承しました

これまでのところ、私のスキーマは次のようになります。

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); 

は、今私はイベントがeventsテーブルの上に挿入することができるようINSTEAD OF INSERTトリガーを作成しようとしていると行が右側のサブになってしまいます-表。しかし、ドキュメントがINSTEAD OF INSERTトリガーがビューのみではなく、テーブル(またはサブテーブル)に作成することができると述べている:

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. 

これを行うための正しい方法は何ですか?

+0

子テーブルを作成するときに 'INHERITS'節を忘れてしまったようです。 –

+0

正直、ありがとう、編集されました。 – Tom

答えて

2

BEFORE INSERTトリガーを宣言する必要があります。

Documentation on partitioningは、この点について非常に優れた情報源であり、例がたくさんあります。空の親テーブルを維持するBEFOREトリガーからNULLを返すドキュメント

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

からドキュメント

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; 

例トリガから

例関数。

+0

パーフェクト、ありがとう。 – Tom

関連する問題