【问题标题】:How to find if a function is inbuilt function or user-defined in postgres如何在postgres中查找函数是内置函数还是用户定义的
【发布时间】:2022-12-25 04:30:41
【问题描述】:

我想知道一个函数是内置的还是它在 postgres 中的用户定义函数。我已经尝试编写下面的查询,但没有任何信息告诉我它是两者之一还是两者之一。在 pgadmin 中搜索函数后,我从 postgres 日志中获取了这个查询。结果列表还显示 dblink 等函数。

 SELECT obj_type, function_owner,obj_name,
            pg_catalog.REPLACE(obj_path, '/'||sn.schema_name||'/', '/'||CASE sn.schema_name
            WHEN 'pg_catalog' THEN 'PostgreSQL Catalog (pg_catalog)'
            WHEN 'pgagent' THEN 'pgAgent Job Scheduler (pgagent)'
            WHEN 'information_schema' THEN 'ANSI (information_schema)'
            ELSE sn.schema_name
            END||'/') AS obj_path,
            schema_name, show_node, other_info,
            CASE
                WHEN sn.schema_name IN ('pg_catalog', 'pgagent', 'information_schema') THEN
                    CASE WHEN CASE
            WHEN sn.schema_name = ANY('{information_schema}')
                THEN false
            ELSE true END THEN 'D' ELSE 'O' END
                ELSE 'N'
            END AS catalog_level
        FROM (
            SELECT
            proowner::regrole::text function_owner,
                CASE
                WHEN t.typname IN ('trigger', 'event_trigger') THEN 'trigger_function'
                ELSE 'function' END::text AS obj_type, p.proname AS obj_name,
            ':schema.'|| n.oid || ':/' || n.nspname || '/' || case when t.typname = 'trigger' then ':trigger_function.' else ':function.' end || p.oid ||':/' || p.proname AS obj_path, n.nspname AS schema_name
,
            CASE WHEN t.typname IN ('trigger', 'event_trigger') THEN True ELSE True END AS show_node,
            pg_catalog.pg_get_function_identity_arguments(p.oid) AS other_info
            from pg_catalog.pg_proc p
            left join pg_catalog.pg_namespace n on p.pronamespace = n.oid
            left join pg_catalog.pg_type t on p.prorettype = t.oid
            WHERE (CASE
            WHEN n.nspname = ANY('{information_schema}')
                THEN false
            ELSE true END) AND NOT p.proisagg



        ) sn
        where 1=1 --lower(sn.obj_name) like '%test12345%'
        AND NOT (sn.schema_name IN ('pg_catalog', 'pgagent', 'information_schema'))
        AND (sn.schema_name IS NOT NULL AND sn.schema_name NOT LIKE 'pg\_%')
        and function_owner <> 'appuser'
        ORDER BY 1, 2, 3

【问题讨论】:

  • pg_catalog 中的任何内容都是内置的。其他一切都是手动或通过扩展创建的
  • 谢谢,我添加了下面的部分以从扩展and obj_name not in ( SELECT p.proname FROM pg_catalog.pg_extension AS e INNER JOIN pg_catalog.pg_depend AS d ON (d.refobjid = e.oid) INNER JOIN pg_catalog.pg_proc AS p ON (p.oid = d.objid) WHERE d.deptype = 'e' ) 中排除功能

标签: postgresql function


【解决方案1】:

Postgres psql 反斜杠命令dfn 显示用户函数。 dfnS 显示内置函数。 dfnS+ 会提供更多细节。命令psql -E 将显示 psql 中任何反斜杠命令后面的查询。注意 dfnS c* 将仅限于那些以C如果你能记住整个名字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 2013-06-14
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    相关资源
    最近更新 更多