繁体   English   中英

使用 SQL 获取相同的 function 列表,它们是“pg_dump”的一部分

[英]Use SQL to get the same list of function that are part of a `pg_dump`

使用pg_dump ,我们得到一个包含 function 定义(以及许多其他数据)的转储。 下面是一个简单的 bash 脚本,即 output 函数的名称:

pg_dump --no-owner mydatabase | grep ^"CREATE FUNCTION" | cut -f 3 -d " " | cut -f 1 -d "("

如何使用纯 postgres SQL 获得等效列表? . 我在stackoverflow上尝试了许多其他答案来列出postgres中的函数,而且我通常会得到更多的函数。

编辑:如果这很重要,我在 postgres 10.14上。 这是一个 postgis-ready 数据库, mydatabase创建为空,然后安装一些扩展(其中包括postgis ),然后通过重放包含(在常规表模式和数据中) CREATE FUNCTION... 我怀疑该应用程序在运行后可能会添加一些其他应用程序,并且我在pg_dump中获得的 function 列表与重播的初始转储中的列表接近。

bash 脚本没有 output postgis function 名称。

如果这有帮助:

$ echo "\df" | psql -qAt mydatabase | wc -l
756
$ pg_dump --no-owner mydatabase | grep ^"CREATE FUNCTION" | cut -f 3 -d " " | cut -f 1 -d "(" | wc -l
30

以下是相关代码:

https://github.com/postgres/postgres/blob/65aaed22a849c0763f38f81338a1cad04ffc0e2c/src/bin/pg_dump/pg_dump.c#L6087

另请参阅前面约 30 行的详细解释性注释。 我将字符串复制/粘贴到 python shell 中以连接这些行,结果是:

SELECT p.tableoid, p.oid, p.proname, p.prolang, p.pronargs, p.proargtypes, p.prorettype, p.proacl, acldefault('f', p.proowner) AS acldefault, p.pronamespace, (%s p.proowner) AS rolname FROM pg_proc p LEFT JOIN pg_init_privs pip ON (p.oid = pip.objoid AND pip.classoid = 'pg_proc'::regclass AND pip.objsubid = 0) WHERE %s
  AND NOT EXISTS (SELECT 1 FROM pg_depend WHERE classid = 'pg_proc'::regclass AND objid = p.oid AND deptype = 'i')
  AND (
  pronamespace != (SELECT oid FROM pg_namespace WHERE nspname = 'pg_catalog')
  OR EXISTS (SELECT 1 FROM pg_cast
  WHERE pg_cast.oid > %u 
  AND p.oid = pg_cast.castfunc)
  OR EXISTS (SELECT 1 FROM pg_transform
  WHERE pg_transform.oid > %u AND 
  (p.oid = pg_transform.trffromsql
  OR p.oid = pg_transform.trftosql)

从代码来看,第一个%s应该是username_subquery,第二个应该是not_agg_check,最后两个是g_last_builtin_oid。 我确实必须在文件周围挖掘一下才能找到这些值(对于 g_last_builtin_oid,谷歌搜索它定义的 FirstNormalObjectId)。 PG 10 的最终结果,只留下与人类相关的列(对于较新的版本有所不同):

testdb=# SELECT p.proname, p.pronamespace, (SELECT rolname FROM pg_catalog.pg_roles WHERE oid =p.proowner) AS rolname FROM pg_proc p LEFT JOIN pg_init_privs pip ON (p.oid = pip.objoid AND pip.classoid = 'pg_proc'::regclass AND pip.objsubid = 0) WHERE NOT p.proisagg
  AND NOT EXISTS (SELECT 1 FROM pg_depend WHERE classid = 'pg_proc'::regclass AND objid = p.oid AND deptype = 'i')
  AND (
  pronamespace != (SELECT oid FROM pg_namespace WHERE nspname = 'pg_catalog')
  OR EXISTS (SELECT 1 FROM pg_cast
  WHERE pg_cast.oid > 16384
  AND p.oid = pg_cast.castfunc)
  OR EXISTS (SELECT 1 FROM pg_transform
  WHERE pg_transform.oid > 16384 AND 
  (p.oid = pg_transform.trffromsql
  OR p.oid = pg_transform.trftosql)));
           proname           | pronamespace | rolname  
-----------------------------+--------------+----------
 blhandler                   |         2200 | myrole
 bar                         |         2200 | myrole
 foo                         |         2200 | myrole
 _pg_expandarray             |        13327 | postgres
 _pg_keysequal               |        13327 | postgres
 _pg_index_position          |        13327 | postgres
 _pg_truetypid               |        13327 | postgres
 _pg_truetypmod              |        13327 | postgres
 _pg_char_max_length         |        13327 | postgres
 _pg_char_octet_length       |        13327 | postgres
 _pg_numeric_precision       |        13327 | postgres
 _pg_numeric_precision_radix |        13327 | postgres
 _pg_numeric_scale           |        13327 | postgres
 _pg_datetime_precision      |        13327 | postgres
 _pg_interval_type           |        13327 | postgres
(15 rows)

(这是我躺在的一个测试数据库中,不确定那些_pg_*是什么,但命名空间是 information_schema 等等)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM