如何在postgresql打印函数和触发器源代码?请让我知道,如果有人知道查询显示的功能,触发器源代码。
当前回答
有很多可能性。最简单的方法是使用pgAdmin并从SQL窗口获取。然而,如果你想通过编程方式获得这些,那么检查pg_proc和pg_trigger系统目录或例程,并从信息模式中触发视图(这是SQL的标准方式,但它可能不包括所有特性,特别是特定于postgresql的特性)。例如:
SELECT
routine_definition
FROM
information_schema.routines
WHERE
specific_schema LIKE 'public'
AND routine_name LIKE 'functionName';
其他回答
\sf function_name在PSQL中产生单个函数的可编辑源代码。
从https://www.postgresql.org/docs/9.6/static/app-psql.html:
\ [+] function_description瑞士法郎 该命令以CREATE或REPLACE function命令的形式获取并显示命名函数的定义。 如果将+追加到命令名后,则输出行编号,函数体的第一行为第1行。
下面是一些来自PostgreSQL-9.5的例子
显示列表:
功能:\ df + 触发器:\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$
自版本:psql (9.6.17, server 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似乎不适合我。
有很多可能性。最简单的方法是使用pgAdmin并从SQL窗口获取。然而,如果你想通过编程方式获得这些,那么检查pg_proc和pg_trigger系统目录或例程,并从信息模式中触发视图(这是SQL的标准方式,但它可能不包括所有特性,特别是特定于postgresql的特性)。例如:
SELECT
routine_definition
FROM
information_schema.routines
WHERE
specific_schema LIKE 'public'
AND routine_name LIKE 'functionName';
列出所有函数:
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;
推荐文章
- 查询JSON类型内的数组元素
- 获得PostgreSQL数据库中当前连接数的正确查询
- 纬度和经度的数据类型是什么?
- 如何在PostgreSQL中临时禁用触发器?
- 输入文件似乎是一个文本格式转储。请使用psql
- 使用LIMIT/OFFSET运行查询,还可以获得总行数
- 当恢复sql时,psql无效命令\N
- 货币应该使用哪种数据类型?
- 如何添加列,如果不存在PostgreSQL?
- 如何在Postgres中获得两个字段的MIN() ?
- 截断Postgres数据库中的所有表
- 如何连接列在Postgres选择?
- 将varchar字段的类型更改为整数:"不能自动转换为整数类型"
- PostgreSQL可以索引数组列吗?
- PostgreSQL:角色不允许登录