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

Règle d'insertion dans la vue Postgres avec clause de retour

Vous feriez bien mieux d'utiliser un INSTEAD OF INSERT déclencheur ici :

CREATE FUNCTION MyFuncName() RETURNS trigger AS $$
DECLARE
  id integer;
BEGIN
  INSERT INTO tableA (time) VALUES COALESCE(NEW.time, NOW()) RETURNING aPrimaryKey INTO id;
  INSERT INTO tableB (aPrimaryKey, someCol1) VALUES (id, NEW.someValue);
  RETURN NEW;
END; $$ LANGUAGE PLPGSQL;

CREATE TRIGGER MyView_on_insert INSTEAD OF INSERT ON MyView
  FOR EACH ROW EXECUTE PROCEDURE MyFuncName();

Vérifier la valeur actuelle d'une séquence pour voir ce qui a été inséré dans une autre table est mauvais mauvais mauvais pratique. Même pendant que vous êtes ici dans une seule transaction, ne le faites pas.

Vous êtes confus au sujet de la question de RETURNING informations, parce que je suis confus aussi quand je lis votre question. À l'intérieur d'une fonction, utilisez le INTO clause pour remplir les variables déclarées localement afin de conserver les valeurs d'enregistrement que vous pouvez ensuite utiliser dans les instructions suivantes. En dehors d'une fonction, utilisez le RETURNING clause comme vous le faites dans votre extrait de code le plus élevé.