2015-10-02 1 views
0

Ceci est l'un des BEFORE déclencheurs qui insère dans le droit table partition:AVANT Trigger + retour retourne NULL

CREATE OR REPLACE FUNCTION public.insert_install_session() 
    RETURNS trigger 
    LANGUAGE plpgsql 
AS 
$body$ 
BEGIN 
    IF (NEW.created >= '2015-10-01 00:00:00' AND NEW.created < '2015-10-02 00:00:00') THEN 
     INSERT INTO install_session_2015_10_01 VALUES (NEW.*); 
    ELSIF (NEW.created >= '2015-10-02 00:00:00' AND NEW.created < '2015-10-03 00:00:00') THEN 
     INSERT INTO install_session_2015_10_02 VALUES (NEW.*); 
    ELSIF (NEW.created >= '2015-09-30 00:00:00' AND NEW.created < '2015-10-01 00:00:00') THEN 
     INSERT INTO install_session_2015_09_30 VALUES (NEW.*); 
    ELSE 
     RETURN NEW; 
    END IF; 
    RETURN NULL; 
END; 
$body$ 

CREATE TRIGGER trigger_insert_install_session 
    BEFORE INSERT ON install_session 
    FOR EACH ROW EXECUTE PROCEDURE insert_install_session 

et j'ai une requête qui utilise RETURNING:

INSERT INTO "install_session" 
    (<columns here>) 
VALUES 
    (<values here>) 
RETURNING "install_session"."id"; 

Comment puis-je faire le travail RETURNING? Il semble qu'il retourne toujours NULL.

Est-ce à cause du RETURN NULL à la fin de la fonction? Je ne peux pas retourner NEW parce que la ligne serait insérée une deuxième fois, non? Voici le official docs.

Répondre

0

Cela ne fonctionnera pas avec une solution de déclenchement. Vous pouvez le faire fonctionner avec des règles au lieu de déclencheurs IIRC, mais qui a d'autres mises en garde ...

Cependant, pour obtenir que l'ID généré automatiquement à partir d'une colonne serial, vous pouvez appeler currval() immédiatement après la commande en la même session:

SELECT currval('name_of_your_id_sequence_here'::regclass); 

Ou même juste lastval() - si les colonnes id respectives dans les partitions ne sont pas héritées (ne partagent pas la même séquence).

SELECT lastval('name_of_your_id_sequence_here'::regclass); 

Vous pouvez utiliser pg_get_serial_sequence() pour trouver le nom de la séquence si vous ne le savez pas:

SELECT currval(pg_get_serial_sequence('install_session', 'id')); 

réponse associée sur les dba.SE:

+0

Les règles fonctionneraient-elles avec des PARTITIONS? Malheureusement, je ne peux pas modifier le code qui utilise RETURNING, donc currval() n'est pas une option pour moi. Merci de l'avoir signalé. – kev