【问题标题】:Any way to list all user-defined PostgreSQL functions?有什么办法可以列出所有用户定义的 PostgreSQL 函数?
【发布时间】:2017-10-23 22:31:09
【问题描述】:

PostgreSQL 提供命令 \dv 来列出所有视图。是否有类似的方法来列出所有用户定义的函数,或者只是列出特定用户定义的那些函数? \sf 要求您知道函数的名称,它将提供函数的定义。 \df 列出了所有函数(并且有很多)。我想要一种方法来显示我定义的函数列表。

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    查找此类查询的最佳方法是将psql--echo-hidden 选项一起使用。然后运行psql 元命令,您将看到使用的查询。

    对于\df,这是:

    SELECT n.nspname as "Schema",
      p.proname as "Name",
      pg_catalog.pg_get_function_result(p.oid) as "Result data type",
      pg_catalog.pg_get_function_arguments(p.oid) as "Argument data types",
     CASE
      WHEN p.proisagg THEN 'agg'
      WHEN p.proiswindow THEN 'window'
      WHEN p.prorettype = 'pg_catalog.trigger'::pg_catalog.regtype THEN 'trigger'
      ELSE 'normal'
     END as "Type"
    FROM pg_catalog.pg_proc p
         LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
    WHERE pg_catalog.pg_function_is_visible(p.oid)
          AND n.nspname <> 'pg_catalog'
          AND n.nspname <> 'information_schema'
    ORDER BY 1, 2, 4;
    

    您可以通过例如调整它将 where 子句更改为:

    AND n.nspname = 'public'
    

    相当于\df public.*


    如果您检查the documentation of pg_proc,您会注意到有一个proowner 列,因此您也可以运行:

    SELECT n.nspname as "Schema",
           p.proname as "Name",
           pg_catalog.pg_get_function_result(p.oid) as "Result data type",
           pg_catalog.pg_get_function_arguments(p.oid) as "Argument data types"
    FROM pg_catalog.pg_proc p
      JOIN pg_catalog.pg_roles u ON u.oid = p.proowner
      LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
    WHERE pg_catalog.pg_function_is_visible(p.oid)
      AND n.nspname = 'public' 
      AND u.rolname = current_user --<< this limits the functions to those that the current user owns.
    

    【讨论】:

    • 直到--echo-hidden。头脑。炸了。
    【解决方案2】:

    我不确定此命令是否完全准确,但它似乎向我显示了某个特定角色拥有的所有功能:

    SELECT routine_name, grantee FROM information_schema.routine_privileges WHERE grantee = '<role>';
    

    无论如何,它给了我我期望看到的结果。

    【讨论】:

      猜你喜欢
      • 2017-10-01
      • 1970-01-01
      • 2016-02-07
      • 2014-05-22
      • 2014-03-28
      • 2012-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多