[英]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
以下是相关代码:
另请参阅前面约 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.