Появляется, если вы можете использовать ПРАВИЛА вместо триггеров для вставки, тогда он может вернуть правильное число, но только с одним ПРАВИЛОМ без оператора WHERE.
ref1
ref2
REF3
другой вариант может заключаться в создании представления, которое «оборачивает» секционированную таблицу, после чего вы возвращаете строку NEW, чтобы указать на успешное обновление строки, без случайного добавления дополнительной нежелательной строки в основную таблицу.
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
Если вы пошли по маршруту оболочки представления, один из вариантов также определить тривиальные триггеры «вместо» для удаления и обновления, а затем вы можете просто использовать имя таблицы представления вместо обычной таблицы во всех транзакциях. .
Другой вариант, использующий представление, - это создание правила вставки, чтобы любые вставки в основной таблице переходили в представление [которое использует его триггер], например (при условии, что у вас уже есть 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.*);
Тогда он будет использовать вашу новую рабочую вставку для представления.