は、あなたの代わりに、インサートのトリガーのルールを使用できるかどうか、それは右の数を返すことができます表示されますが、だけでWHERE文のない単一のルール。
ref1
ref2
ref3
別のオプションは、パーティションテーブルを「ラップ」というビューを作成し、その後、あなたは成功した行の更新を示すために、新しい行を返す、なしにすることであってもよいです誤って不要な行をマスター表に追加してしまいます。
create view tablename_view as select * from tablename; -- create trivial wrapping view
CREATE OR REPLACE FUNCTION partitioned_insert_trigger() -- partitioned insert trigger
RETURNS TRIGGER AS $$
BEGIN
IF (NEW.partition_key>= 5500000000 AND
NEW.partition_key < 6000000000) THEN
INSERT INTO tablename_55_59 VALUES (NEW.*);
ELSIF (NEW.partition_key >= 5000000000 AND
NEW.partition_key < 5500000000) THEN
INSERT INTO tablename_50_54 VALUES (NEW.*);
ELSIF (NEW.partition_key >= 500000000 AND
NEW.partition_key < 1000000000) THEN
INSERT INTO tablename_5_9 VALUES (NEW.*);
ELSIF (NEW.partition_key >= 0 AND
NEW.partition_key < 500000000) THEN
INSERT INTO tablename_0_4 VALUES (NEW.*);
ELSE
RAISE EXCEPTION 'partition key is out of range. Fix the trigger function';
END IF;
RETURN NEW; -- RETURN NEW in this case, typically you'd return NULL from this trigger, but for views we return NEW
END;
$$
LANGUAGE plpgsql;
CREATE TRIGGER insert_view_trigger
INSTEAD OF INSERT ON tablename_view
FOR EACH ROW EXECUTE PROCEDURE partitioned_insert_trigger(); -- create "INSTEAD OF" trigger
REF:http://www.postgresql.org/docs/9.2/static/trigger-definition.html
あなたは1つのオプションも同様に、削除および更新のためのトリガー「の代わりに」些細な定義することであるビューラッパーのルートを行った場合、あなただけの名前を使用することができますすべてのトランザクションで通常の表の代わりにビュー表を使用します。
ビューを使用するもう1つのオプションは、メインテーブルのすべての挿入がビュー[トリガーを使用する]に移動するように挿入ルールを作成することです(上記のようにすでにpartitioned_insert_trigger
とtablename_viewとinsert_view_triggerが作成されていると仮定します) )
create RULE use_right_inserter_tablename AS
ON INSERT TO tablename
DO INSTEAD insert into tablename_view VALUES (NEW.*);
次に、新しいワーキングビューラッパー挿入を使用します。
その他のHibernate 3.5のソリューションはありますか? –