如何在PostgreSQL中显示功能,程序,触发源代码?


168

如何在PostgreSQL中打印函数并触发源代码?请让我知道是否有人知道查询以显示该功能,并触发源代码。


11
作为追随者谁来到这里试图找出如何列出所有触发器的说明,它是select * from pg_trigger;或者,如果你也想看到每个触发器应用于哪个表select tgrelid::regclass, tgname from pg_trigger;FWIW`
rogerdpack

Answers:



130

对于功能:

您可以查询pg_proc视图,如下所示

select proname,prosrc from pg_proc where proname= your_function_name; 

另一种方法是只执行公共区域\df\ef可以列出功能。

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

它将显示该函数的源代码。

对于触发器:

我不知道是否有直接方法来获取源代码。只知道以下方式,可能会对您有所帮助!

  • 步骤1:获取触发器的表oid:
    skytf =>从pg_trigger中选择tgrelid,其中tgname ='insert_tbl_tmp_trigger';
      翠格利德
    ---------
       26599
    (1列)
  • 步骤2:获取上述oid的表名!
    skytf =>从pg_class中选择oid,relname,其中oid = 26599;
      oid | 相对名称           
    ------- + -----------------------------
     26599 | tbl_tmp
    (1列)
  • 步骤3:列出表信息
    skytf => \ d tbl_tmp

它将向您显示表触发器的详细信息。通常,触发器使用功能。因此,您可以获取触发函数的源代码,就像我上面指出的那样!


37

以下是PostgreSQL-9.5中的一些示例

显示清单:

  1. 功能: \df+
  2. 触发条件: \dy+

显示定义:

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$

7
使用\xfirst来打开扩展显示还有助于提高可读性。
Pocketsand,

26

有很多可能性。最简单的方法是只使用pgAdmin并从SQL窗口获取它。但是,如果您想以编程方式获取此信息,请进行检查pg_proc信息,则可以从信息模式中和查看pg_trigger系统目录或视图(这是SQL标准方法,但可能无法涵盖所有​​功能,尤其是PostgreSQL特定的功能)。例如:routinestriggers

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

3
嗯..我有PGPSQL函数,这些函数具有一个空白的例程定义,并在例程例程的字段中声明“ EXTERNAL”。我在哪里可以找到那些提示?
alfonx 2012年

2
+1这是更标准/便携式的解决方案。对于视图来说,SQL是:SELECT view_definition FROM information_schema.views WHERE table_schema = ? AND table_name = ?
Franta

但是,由于某人使用相同的名称和不同的函数参数制作函数时,函数名称不唯一的情况又如何呢?stackoverflow.com/questions/47341513/...
mg1075

@alfonx看到pgproc.prosrc
托马什Záluský




0

从版本开始:psql(9.6.17,服务器11.6)

我已经尝试了以上所有答案,但对我来说

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似乎不适合我。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.