28

我需要 PostgreSQL 数据库对象的创建脚本。

我无权访问 pg_dump。所以我必须使用 SQL 查询来获取所有内容。我怎么能这样做?

4

3 回答 3

47

要获取函数的定义,请使用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视图。

于 2012-08-27T20:31:00.287 回答
14

你会发现psql -E在你寻求这些查询的过程中很有帮助。
它显示psql执行其反斜杠命令时使用的查询 - 就像\df+ myfunc有关此功能的详细信息。

于 2012-08-27T22:45:22.183 回答
6

这是使用 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
;;

请注意,您显然应该指定架构名称,(如果您使用的是该架构,则为“公共”)

于 2014-06-03T23:39:06.687 回答