显示 PostgreSQL 中函数、过程和触发器的代码

问题描述 投票:0回答:10

如何在 PostgreSQL 中显示函数、过程和触发器的代码?如果有人知道查询以显示他们的代码,请告诉我。

database postgresql stored-procedures triggers dbfunctions
10个回答
223
投票

psql

 中的
\df+ 为您提供源代码。


166
投票

对于功能:

可以查询pg_proc视图,如下

select proname,prosrc from pg_proc where proname= your_function_name; 

另一种方法是执行commont

\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;
      类 |别名
    -------+----------------------------
     26599 | 26599 tbl_tmp
    (1 行)
  • 第3步:列出表信息
 skytf=> \d tbl_tmp

它将向您显示该表的触发器的详细信息。通常触发器使用函数。这样你就可以得到触发函数的源代码,就像我上面指出的那样!


64
投票

以下是 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$

33
投票

有很多可能性。最简单的方法是使用 pgAdmin 并从 SQL 窗口获取它。但是,如果您想以编程方式获取此信息,请检查信息模式中的

pg_proc
pg_trigger
系统目录或
routines
triggers
视图(这是 SQL 标准方式,但它可能不涵盖所有功能,尤其是 PostgreSQL 特定的功能)。例如:

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

23
投票

不仅仅是显示功能,还可以获取就地编辑功能。

\ef <function_name>
非常方便。它将以可编辑格式打开该函数的源代码。 您不仅可以查看它,还可以编辑和执行它。

只需

\ef
不带 function_name 将打开可编辑的 CREATE FUNCTION 模板。

供进一步参考 -> https://www.postgresql.org/docs/9.6/static/app-psql.html


22
投票
psql 中的

\sf
function_name 生成单个函数的可编辑源代码。

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

\sf[+] 函数描述 此命令以 CREATE OR REPLACE FUNCTION 命令的形式获取并显示指定函数的定义。

如果命令名称后附加 +,则输出行将被编号,函数体的第一行为第 1 行。


14
投票

除了@franc的答案之外,您还可以从sql接口使用它:

select 
    prosrc
from pg_trigger, pg_proc
where
 pg_proc.oid=pg_trigger.tgfoid
 and pg_trigger.tgname like '<name>'

(摘自这里:http://www.postgresql.org/message-id/Pine.BSF.4.10.10009140858080.28013-100000@megazone23.bigpanda.com


7
投票

自版本: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 似乎不适合我。


7
投票

列出所有功能:

select n.nspname as function_schema,
       p.proname as function_name,
       l.lanname as function_language,
       case when l.lanname = 'internal' then p.prosrc
            else pg_get_functiondef(p.oid)
            end as definition,
       pg_get_function_arguments(p.oid) as function_arguments,
       t.typname as return_type
from pg_proc p
left join pg_namespace n on p.pronamespace = n.oid
left join pg_language l on p.prolang = l.oid
left join pg_type t on t.oid = p.prorettype 
where n.nspname not in ('pg_catalog', 'information_schema')
order by function_schema,
             function_name;

现在,如果您想在所有函数中搜索特定单词或文本,请确保替换函数中的文本:

with tbl as (
select n.nspname as function_schema,
       p.proname as function_name,
       l.lanname as function_language,
       case when l.lanname = 'internal' then p.prosrc
            else pg_get_functiondef(p.oid)
            end as definition,
       pg_get_function_arguments(p.oid) as function_arguments,
       t.typname as return_type
from pg_proc p
left join pg_namespace n on p.pronamespace = n.oid
left join pg_language l on p.prolang = l.oid
left join pg_type t on t.oid = p.prorettype 
where n.nspname not in ('pg_catalog', 'information_schema')
)
    select *
    from tbl
    where definition ilike '%word or text you want to search%'
    order by function_schema,
             function_name;

0
投票

例如,您可以使用

\sf
显示 my_func() 函数的代码,如下所示:

\sf public.my_func

*备注:

  • 您可以省略架构

    public.

  • 您还可以使用

    \sf
    显示过程的代码。

  • 我的回答解释了如何详细显示函数的代码。

并且,您可以使用

pg_get_triggerdef()
pg_trigger显示my_t触发器的代码和
my_t
触发器的OID(对象标识符),如下所示:

SELECT pg_get_triggerdef((SELECT oid FROM pg_trigger WHERE tgname = 'my_t'));

*备注:

此外,还可以通过

\sv
显示my_v视图的代码,如下所示:

\sv public.my_v

*备注:

  • 您可以省略架构

    public.

  • 我的回答详细解释了如何显示视图的代码。

© www.soinside.com 2019 - 2024. All rights reserved.