Apparaît si vous pouvez utiliser des règles au lieu de déclencheurs pour l'insertion, il peut renvoyer le bon numéro, mais seulement avec une seule règle sans une instruction WHERE.
ref1
ref2
ref3
une autre option peut être de créer une vue que « wraps » La table partitionnée, puis vous revenez la ligne NOUVEAU sur pour indiquer une mise à jour de la ligne réussie, sans ajouter accidentellement une ligne indésirable supplémentaire à la table principale.
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
Si vous êtes allé la route wrapper vue d'une option est de définir aussi trivial « au lieu de » déclenche pour supprimer et mettre à jour, ainsi, vous pouvez simplement utiliser le nom du Voir la table à la place de votre table normale dans toutes les transactions.Une autre option qui utilise la vue est de créer une règle d'insertion pour que les insertions de la table principale accèdent à la vue [qui utilise son déclencheur], ex (en supposant que vous avez déjà partitioned_insert_trigger
et que tablename_view et insert_view_trigger sont créés comme indiqué ci-dessus
create RULE use_right_inserter_tablename AS
ON INSERT TO tablename
DO INSTEAD insert into tablename_view VALUES (NEW.*);
Ensuite, il utilisera votre nouvel insert d'encapsulation de vue de travail.
D'autres solutions pour Hibernate 3.5? –