2011-08-01 20 views
100

Cómo imprimir funciones y desencadena el código fuente en postgresql? por favor, avíseme si alguien sabe la consulta para mostrar la función, desencadena el código fuente.¿Cómo se muestra la función, el procedimiento y el código fuente de los desencadenadores en postgresql?

+5

como una nota para los seguidores que llegaron aquí tratando de encontrar la manera de una lista de todos los factores desencadenantes, es 'seleccionar * de pg_trigger;' o, si también desea ver qué mesa de cada uno trigger se aplica a 'select tgrelid :: regclass, tgname from pg_trigger;' FWIW ' – rogerdpack

Respuesta

15

Hay muchas posibilidades. La forma más sencilla es simplemente usar pgAdmin y obtener esto desde la ventana de SQL. Sin embargo, si desea obtener esto programáticamente, examine los catálogos del sistema pg_proc y pg_trigger o las routines y triggers vistas desde el esquema de información (es una forma estándar de SQL, pero puede que no cubra todas las funciones, especialmente las específicas de PostgreSQL). Por ejemplo:

SELECT 
    routine_definition 
FROM 
    information_schema.routines 
WHERE 
    specific_schema LIKE 'public' 
    AND routine_name LIKE 'functionName'; 
+2

Mmmm .. Tengo funciones PGPSQL, que tienen un routing_definition vacío, y digo 'EXTERNAL' en el campo routine_body. ¿Alguna pista donde puedo encontrarlos? – alfonx

+2

+1 Esta es una solución más estándar/portátil. Para las vistas, el SQL es: 'SELECT view_definition FROM information_schema.views WHERE table_schema =? AND table_name =? ' – Franta

+0

Pero, ¿qué pasa con el caso en que el nombre de una función no es único porque alguien hizo funciones con el mismo nombre y diferentes argumentos de funciones? https://stackoverflow.com/questions/47341513/postgresql-how-to-display-function-or-trigger-or-view-code-for-a-unique-item – mg1075

94

para la función:

se puede consultar la vista pg_proc, al igual que el siguiente

select proname,prosrc from pg_proc where proname= your_function_name; 

Otra forma es que sólo hay que ejecutar el commont \df y \ef que puede enumera las funciones.

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 

Mostrará el código fuente de la función.

Para desencadenantes:

I dont't saber si hay una manera directa para obtener el código fuente. Solo sé de la siguiente manera, ¡puede ser que te ayude!

  • paso 1: Obtener el OID tabla del disparador:
 
    skytf=> select tgrelid from pg_trigger where tgname='insert_tbl_tmp_trigger'; 
     tgrelid 
    --------- 
     26599 
    (1 row) 
  • paso 2: Obtener el nombre de la tabla de la OID de arriba!
 
    skytf=> select oid,relname from pg_class where oid=26599; 
     oid |   relname   
    -------+----------------------------- 
    26599 | tbl_tmp 
    (1 row) 
  • paso 3: lista de la información de la tabla
 
    skytf=> \d tbl_tmp 

Se le mostrará los detalles del gatillo de la tabla. Por lo general, un desencadenador utiliza una función. ¡De modo que puede obtener el código fuente de la función de disparo como lo anterior que señalé!

+0

Cómo ver ** funciones de una instalación EXTENSION? ** Ejemplo Estoy usando [ltree] (https://www.postgresql.org/docs/current/static/ltree.html), pero no hay respuesta con '\ df ltxtquery'. –

99

\df+ en psql le proporciona el código fuente.

+13

Agradable :) Sugiero usar '\ df' para encontrar el nombre de su función, luego' \ x' para la salida expandida, luego '\ df + name_of_function' –

+8

\ df + genera mucho más que el código. Si todo lo que quieres es el código, \ sf hará el truco! – Telic

+0

Cómo ver ** funciones de una EXTENSIÓN instalada? ** Ejemplo Estoy usando [ltree] (https://www.postgresql.org/docs/current/static/ltree.html), pero no hay respuesta con ' \ df ltxtquery'. –

16

Aquí están algunos ejemplos de PostgreSQL-9.5

lista de visualización:

  1. Funciones: \df+
  2. disparadores: \dy+

Pantalla Definición:

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$ 
1

\sf function_name en psql produce código fuente editable de una sola función.

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

\ sf function_description [+] Este comando recuperaciones y muestra la definición de la función llamada, en forma de un comando CREATE OR REPLACE FUNCTION.

Si + se añade al nombre del comando, a continuación, las líneas de salida están numeradas, con la primera línea del cuerpo de la función de ser la línea 1.

3

Un poco más de simplemente mostrar la función, la forma de conseguir la edita las instalaciones in situ también.

\ef <function_name> es muy útil. Se abrirá el código fuente de la función en formato editable. No solo podrá verlo, también puede editarlo y ejecutarlo.

Sólo \ef sin nombre_de_función abrirá la plantilla CREATE FUNCTION editable.

Para mayor referencia ->https://www.postgresql.org/docs/9.6/static/app-psql.html

Cuestiones relacionadas