出現,如果你可以使用規則的INSTEAD OF觸發器用於插入,那麼它可以返回正確的數字,而只用沒有WHERE語句的單個RULE。
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
裁判:http://www.postgresql.org/docs/9.2/static/trigger-definition.html
如果你去視圖包裝路線的一個選項是還定義微不足道「而不是」觸發器刪除和更新,以及,那麼你可以使用的名稱查看錶以代替所有交易中的普通表。
使用該視圖的另一個選擇是創建插入規則,以便主表上的任何插入都轉到視圖[使用其觸發器],前(假設您已經創建了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的解決方案? – 2010-05-25 13:58:16