PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Le déclencheur PostgreSQL ne renvoie rien

Votre question laisse place à interprétation. D'après ce que j'ai compris, vous voulez le RETURNING clause du INSERT commande pour retourner la valeur de la clé primaire générée par une séquence.

Il existe d'autres moyens d'y parvenir. Comme utiliser nextval() pour obtenir le prochain id de la séquence au préalable et insérez la ligne avec le id épelé.
OU currval() / lastval() pour obtenir la valeur la plus récemment obtenue pour une séquence / toute séquence de la session en cours. Plus dans cette réponse connexe :
Valeur suivante PostgreSQL des séquences ?

Vous pouvez également utiliser une RULE ... INSTEAD .. à cet effet.

Mais, pour répondre à votre question - si telle est bien votre question :cela peut être fait en utilisant deux déclencheurs . Un BEFORE , un AFTER INSERT .Les deux sont déclenchés dans une transaction par définition, de sorte que la ligne fantôme de votre première table n'est jamais visible par personne (sauf les déclencheurs).

Démo :

CREATE TABLE x (
  id serial PRIMARY KEY  -- note the serial col.
 ,name text
);

CREATE TABLE y (
  id integer PRIMARY KEY
 ,name text
);


CREATE OR REPLACE FUNCTION trg_x_insbef()
  RETURNS trigger AS
$func$
BEGIN
  INSERT INTO y SELECT (NEW).*;  -- write to other table
  RETURN NEW;
END
$func$ LANGUAGE plpgsql;

CREATE TRIGGER insbef
  BEFORE INSERT ON x
  FOR EACH ROW EXECUTE PROCEDURE trg_x_insbef();


CREATE OR REPLACE FUNCTION trg_x_insaft()
  RETURNS trigger AS
$func$
BEGIN
  DELETE FROM x WHERE id = NEW.id; -- delete row again.
  RETURN NULL;
END
$func$ LANGUAGE plpgsql;

CREATE TRIGGER insaft
  AFTER INSERT ON x
  FOR EACH ROW EXECUTE PROCEDURE trg_x_insaft();

Appelez psql :

db=# INSERT INTO x (name) values('phantom') RETURNING id;
 id
----
  1
(1 row)

INSERT 0 1

db=# SELECT * FROM x;
 id | name
----+------
(0 rows)


db=# SELECT * FROM y;
 id |  name
----+---------
  1 | phantom
(1 row)