10 votes

PostgreSQL : Comment exporter une définition de fonction vers SQL

J'ai une fonction (procédure stockée) définie dans une base de données que je voudrais modifier.

Je pense qu'une façon de procéder est de vider la définition de la fonction dans un fichier SQL, de modifier le fichier SQL, puis de remplacer la définition dans la base de données par la version modifiée.

Est-il possible de faire cela (vider la définition dans un fichier SQL) ?

Ce que je faisais jusqu'à présent, c'était d'utiliser psql pour me connecter à la base de données, d'exécuter la fonction /df+, de copier la sortie dans un fichier texte, de remanier le texte pour qu'il ressemble à une déclaration de fonction, mais cela prend du temps et je me demande s'il n'y a pas une façon plus élégante de le faire.

J'utilise PostgreSQL 9.1 si cela a de l'importance.

EDIT :

J'ai accepté la réponse de Mike Buland parce qu'il a fourni la réponse correcte dans son commentaire, qui était d'exécuter \ef dans psql.

6voto

Mike Buland Points 621

Ce point est en fait mentionné dans une question précédente :

SELECT  proname, prosrc
FROM    pg_catalog.pg_namespace n
JOIN    pg_catalog.pg_proc p
ON      pronamespace = n.oid
WHERE   nspname = 'public';

Liste des fonctions stockées qui font référence à une table dans PostgreSQL

Vous devriez pouvoir l'utiliser en ligne de commande ou avec un client pour lire le texte actuel de la proc et faire ce que vous voulez avec :)

J'espère que cela vous aidera.

3voto

Erwin Brandstetter Points 110228

Vous aurez également besoin des arguments de la fonction :

SELECT p.proname
     , pg_catalog.pg_get_function_arguments(p.oid) as params
     , p.prosrc
FROM   pg_catalog.pg_proc p
WHERE  oid = 'myschema.myfunc'::regproc;

Ou, pour que cela soit sans ambiguïté pour les fonctions avec paramètres :

WHERE  oid = 'myschema.myfunc(text)'::regprocedure;

Ou vous pouvez utiliser pgAdmin pour faire ce que vous décrivez beaucoup plus confortablement. Il affiche le script SQL complet pour recréer les objets et a une option pour le copier automatiquement dans la fenêtre d'édition. Éditez et exécutez.

0voto

Bob Points 9217

Je pense que vous devez prendre du recul et voir le problème de fond ici. C'est-à-dire que vous n'utilisez pas de contrôle de version pour versionner vos fichiers (objets de base de données). Il y en a beaucoup de gratuits, Git et Mercurial pour n'en citer que quelques-uns. Utilisez psql ou la requête fournie par Mike pour extraire la structure et la placer dans le contrôle de version. A l'avenir, vous pourrez les extraire du contrôle de version et y faire des modifications. Vous devriez déployer le code depuis ce système de contrôle de version vers le serveur de base de données. Il est également utile de vérifier que le code que vous avez dans le contrôle de version correspond au code de la base de données de manière automatisée et régulière. En théorie, si un processus strict est mis en place, le code qui n'est pas contrôlé dans le système de contrôle de la version ne devrait jamais se retrouver dans la base de données et vous n'avez jamais à vous demander si le contrôle de la version correspond à ce qui se trouve dans la base de données. Cependant, je ne suis pas sûr que les personnes ayant un accès administrateur n'abuseront pas de leur privilège, c'est pourquoi j'ai mis en place des mesures pour vérifier cela. S'il s'avère que quelqu'un abuse de ses privilèges, cela peut être traité d'une autre manière.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X