Comment afficher la fonction, la procédure, le code source des déclencheurs dans postgresql?

168

Comment imprimer des fonctions et des déclencheurs de code source dans postgresql? s'il vous plaît laissez-moi savoir si quelqu'un connaît la requête pour afficher la fonction, déclenche le code source.

Ganesh
la source
11
comme une note pour les abonnés qui sont arrivés ici pour essayer de trouver comment lister tous les déclencheurs, c'est select * from pg_trigger;ou, si vous voulez aussi voir quelle table chaque déclencheur s'applique à select tgrelid::regclass, tgname from pg_trigger;FWIW `
rogerdpack

Réponses:

152

\df+dans psql vous donne le code source.

Mateusz Grotek
la source
17
Nice one :) Je suggère d'utiliser \dfpour trouver le nom de votre fonction, puis \xpour une sortie étendue, puis\df+ name_of_function
Sam Watkins
33
\ df + produit bien plus que le code. Si vous ne voulez que le code, \ sf fera l'affaire!
Telic
Comment voir les fonctions d'une EXTENSION installée? Exemple J'utilise ltree , mais il n'y a pas de réponse avec \df ltxtquery.
Peter Krauss le
\x ONest un must pour l'affichage transposé
andilabs
130

Pour la fonction:

vous pouvez interroger la vue pg_proc, comme suit

select proname,prosrc from pg_proc where proname= your_function_name; 

Une autre façon est d'exécuter simplement le commont \dfet \efqui peut lister les fonctions.

skytf=> \df           
                                             List of functions
 Schema |         Name         | Result data type |              Argument data types               |  Type  
--------+----------------------+------------------+------------------------------------------------+--------
 public | pg_buffercache_pages | SETOF record     |                                                | normal


skytf=> \ef  pg_buffercache_pages

Il affichera le code source de la fonction.

Pour les déclencheurs:

Je ne sais pas s'il existe un moyen direct d'obtenir le code source. Sachez simplement la manière suivante, peut-être que cela vous aidera!

  • Étape 1: Obtenez le tableau oid du déclencheur:
    skytf => sélectionnez tgrelid dans pg_trigger où tgname = 'insert_tbl_tmp_trigger';
      tgrelid
    ---------
       26599
    (1 rangée)
  • Étape 2: Obtenez le nom de la table de l'oid ci-dessus!
    skytf => sélectionnez oid, relname de pg_class où oid = 26599;
      oid | relname           
    ------- + -----------------------------
     26599 | tbl_tmp
    (1 rangée)
  • étape 3: lister les informations du tableau
    skytf => \ d tbl_tmp

Il vous montrera les détails du déclencheur de la table. Habituellement, un déclencheur utilise une fonction. Vous pouvez donc obtenir le code source de la fonction de déclenchement tout comme ce que j'ai indiqué ci-dessus!

francs
la source
38

Voici quelques exemples de PostgreSQL-9.5

Afficher la liste:

  1. Les fonctions: \df+
  2. Déclencheurs: \dy+

Définition d'affichage:

postgres=# \sf
function name is required

postgres=# \sf pg_reload_conf()
CREATE OR REPLACE FUNCTION pg_catalog.pg_reload_conf()
 RETURNS boolean
 LANGUAGE internal
 STRICT
AS $function$pg_reload_conf$function$

postgres=# \sf pg_encoding_to_char
CREATE OR REPLACE FUNCTION pg_catalog.pg_encoding_to_char(integer)
 RETURNS name
 LANGUAGE internal
 STABLE STRICT
AS $function$PG_encoding_to_char$function$
Sathish
la source
7
L'utilisation du \xpremier pour activer l'affichage étendu contribue également à la lisibilité.
Pocketsand
26

Il existe de nombreuses possibilités. Le moyen le plus simple consiste simplement à utiliser pgAdmin et à obtenir cela à partir de la fenêtre SQL. Cependant, si vous voulez obtenir cela par programme, examinez pg_procet les pg_triggercatalogues système ou routineset les triggersvues à partir du schéma d'information (c'est la méthode standard SQL, mais cela peut ne pas couvrir toutes les fonctionnalités, en particulier celles spécifiques à PostgreSQL). Par exemple:

SELECT
    routine_definition 
FROM
    information_schema.routines 
WHERE
    specific_schema LIKE 'public'
    AND routine_name LIKE 'functionName';
Grzegorz Szpetkowski
la source
3
Mmmm .. J'ai des fonctions PGPSQL, qui ont une routine_defintion vide, et qui indiquent «EXTERNAL» dans le champ routine_body. Un indice où je peux les trouver?
alfonx
2
+1 C'est une solution plus standard / portable. Pour les vues, le SQL est:SELECT view_definition FROM information_schema.views WHERE table_schema = ? AND table_name = ?
Franta
Mais qu'en est-il du cas où un nom de fonction n'est pas unique parce que quelqu'un a créé des fonctions avec le même nom et des arguments de fonction différents? stackoverflow.com/questions/47341513/…
mg1075
@alfonx voir la pgproc.prosrcchronique
Tomáš Záluský
12

Un peu plus que simplement afficher la fonction, que diriez-vous également de la fonction d'édition sur place.

\ef <function_name>est très pratique. Il ouvrira le code source de la fonction dans un format modifiable. Vous pourrez non seulement le visualiser, mais également le modifier et l'exécuter.

Juste \efsans nom_fonction, vous ouvrirez le modèle CREATE FUNCTION modifiable.

Pour plus d'informations -> https://www.postgresql.org/docs/9.6/static/app-psql.html

mythique codeur
la source
11

\sf nom_fonction dans psql produit le code source modifiable d'une seule fonction.

Depuis https://www.postgresql.org/docs/9.6/static/app-psql.html :

\ sf [+] description_fonction Cette commande récupère et affiche la définition de la fonction nommée, sous la forme d'une commande CRÉER OU REMPLACER UNE FONCTION.

Si + est ajouté au nom de la commande, les lignes de sortie sont numérotées, la première ligne du corps de la fonction étant la ligne 1.

Sergey Tarasov
la source
affiche le code source d'une fonction. \ ef function name l'ouvre dans un modèle modifiable
amar
0

Depuis la version: psql (9.6.17, serveur 11.6)

J'ai essayé toutes les réponses ci-dessus mais pour moi

postgres=> \sf jsonb_extract_path_text
CREATE OR REPLACE FUNCTION pg_catalog.jsonb_extract_path_text(from_json jsonb, VARIADIC path_elems text[])
 RETURNS text
 LANGUAGE internal
 IMMUTABLE PARALLEL SAFE STRICT
AS $function$jsonb_extract_path_text$function$



postgres=> \df+
ERROR:  column p.proisagg does not exist
LINE 6:   WHEN p.proisagg THEN 'agg'
               ^
HINT:  Perhaps you meant to reference the column "p.prolang".

df ne semble pas fonctionner pour moi.

Ravi Parekh
la source