web-dev-qa-db-fra.com

Insérer un enregistrement dans une table dans une fonction de déclenchement

J'aimerais insérer une variable de type de données d'enregistrement (nouvelle variable) dans une table dans un déclencheur. À quoi ressemblerait le SQL?
[.____] Les tentatives suivantes ont échoué:

EXECUTE 'INSERT INTO my_table VALUES ' || NEW;
EXECUTE 'INSERT INTO my_table VALUES ' || NEW.*;
EXECUTE 'INSERT INTO my_table SELECT * FROM ' || NEW;
8
Egidi

Vous devez élargir l'enregistrement.

J'ai également ajouté une liste de colonnes au insert et utilisé le beaucoup plus sûr EXECUTE ... USING forme.

EXECUTE 'INSERT INTO my_table (col1, col2, col3) VALUES (?, ?, ?)' USING NEW.col1, NEW.col2, NEW.col3;

Veuillez expliquer votre cas d'utilisation plus en détail si cela ne résout pas le problème.

5
Craig Ringer

En fait, vous n'avez pas besoin d'élargir le disque manuellement. Tant que Number, séquence et types de colonnes correspondant entre les deux tables, vous pouvez utiliser cette forme beaucoup plus simple. :

EXECUTE 'INSERT INTO my_table SELECT ($1).*'
USING NEW;

Étant donné que votre nom de table semble être stable, vous n'avez même pas besoin de SQL dynamique avec EXECUTE. Juste une plaine INSERT:

INSERT INTO my_table SELECT (NEW).*

Les parenthèses sont requis pour un type composite pour rendre la syntaxe sans ambiguïté.

Demandez-vous ce qui peut changer dans votre application à l'avenir:

  • Si la table cible doit rester synchronisée avec la table source (ou la cible et la source sont les mêmes), c'est mieux non pour répertorier les colonnes explicitement.

  • Si vous souhaitez sélectionner uniquement certaines colonnes et ne souhaitez pas modifier cela avec des mises à jour possibles à la table source ou à la table cible, il est préférable de fournir une liste de colonnes.

15
Erwin Brandstetter