使用SQL查询获取Postgresql中函数、序列、类型等的定义

cvxl0en2  于 2022-12-22  发布在  PostgreSQL
关注(0)|答案(4)|浏览(232)

我需要PostgreSQL数据库对象的创建脚本。
我没有访问pg_dump的权限。所以我必须用SQL查询来获取所有内容。我怎么能做到呢?

mutmk8jj

mutmk8jj1#

要获取函数的定义,请使用pg_get_functiondef()

select pg_get_functiondef(oid)
from pg_proc
where proname = 'foo';

索引、视图、规则等的定义也有类似的取数功能,具体参见手册:http://www.postgresql.org/docs/current/static/functions-info.html
获取用户类型的定义有点棘手,需要查询information_schema.attributes

select attribute_name, data_type
from information_schema.attributes
where udt_schema = 'public'
  and udt_name = 'footype'
order by ordinal_position;

然后,您需要重新组装create type语句。
有关详细信息,您需要通读系统目录的文档:http://www.postgresql.org/docs/current/static/catalogs.html
但是如果information_schema视图返回相同的信息,您应该更喜欢它们。

eyh26e7m

eyh26e7m2#

您将发现psql -E在您寻求这些查询时非常有用。
它显示了psql在执行其反斜杠命令时使用的查询,如\df+ myfunc,以了解有关此函数的详细信息。

rmbxnbpk

rmbxnbpk3#

下面是使用pg_get_functiondef的完整示例查询:

WITH funcs AS (
  SELECT
    n.nspname AS schema
    ,proname AS sproc_name
    ,proargnames AS arg_names
    ,t.typname AS return_type
    ,d.description
    ,pg_get_functiondef(p.oid) as definition
  FROM pg_proc p
    JOIN pg_type t on p.prorettype = t.oid
    JOIN pg_description d on p.oid = d.objoid
    JOIN pg_namespace n on n.oid = p.pronamespace
  WHERE n.nspname = 'some_schema_name_here'
)
SELECT *
FROM funcs
;;

注意,您显然应该指定模式名称(如果您使用的是该模式,则指定“public”)

pkwftd7m

pkwftd7m4#

您还可以执行\sf以查看psql中的用户定义函数

相关问题