【问题标题】:PostgreSQL, drop custom functionsPostgreSQL,删除自定义函数
【发布时间】:2014-02-17 04:39:40
【问题描述】:

为了从 pgdump 中恢复我的数据,我需要从数据库中删除自定义函数。
这个函数可以很好地识别它们:

SELECT pp.proname
  FROM pg_proc pp
 INNER JOIN pg_namespace pn on (pp.pronamespace = pn.oid)
 INNER JOIN pg_language pl on (pp.prolang = pl.oid)
 WHERE pl.lanname NOT IN ('c','internal') 
   AND pn.nspname NOT LIKE 'pg_%'
   AND pn.nspname <> 'information_schema';

所以,在我听到 dynamic SQL 并确保我可以从 .NET 中使用它之后,我立即尝试将它应用到那个目的。

do
$$
declare
   func_rec record;
begin
   for func_rec in (SELECT pp.proname as funcname 
                      FROM pg_proc pp
                     INNER JOIN pg_namespace pn on (pp.pronamespace = pn.oid)
                     INNER JOIN pg_language pl on (pp.prolang = pl.oid)
                     WHERE pl.lanname NOT IN ('c','internal') 
                       AND pn.nspname NOT LIKE 'pg_%'
                       AND pn.nspname <> 'information_schema')
   loop
     execute 'drop function '||func_rec.funcname||' cascade';
   end loop;
end;
$$

与此同时,我发现要删除一个函数,我必须将其参数提供给 DROP 命令。
这是一个关于如何检索这些参数的example 子查询:

 (SELECT typname FROM pg_type WHERE oid = funcrow.proargtypes[i])

现在仍然存在一个问题,我不知道如何将它们放入功能代码中,这会将所需的参数添加到 func_rec.funcname 以删除此类函数。

所以,请帮助获取从所有函数中删除自定义函数的查询。

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    因为函数可以在 Postgres 中重载,所以您需要在 drop 中包含函数的签名。

    假设你有这些函数:

    get_answer(p1 integer);
    get_answer(p1 integer, p2 integer);
    

    那么 Postgres 在使用 drop function get_answer; 时不知道要删除哪一个。

    幸运的是,Postgres 具有格式化参数的功能,以便可以将它们用于该目的:pg_get_function_identity_arguments

    所以您需要将您的选择更改为:

    SELECT pp.proname||'('||pg_get_function_identity_arguments(pp.oid)||')' as funcname
      FROM pg_proc pp
     INNER JOIN pg_namespace pn on (pp.pronamespace = pn.oid)
     INNER JOIN pg_language pl on (pp.prolang = pl.oid)
     WHERE pl.lanname NOT IN ('c','internal') 
       AND pn.nspname NOT LIKE 'pg_%'
       AND pn.nspname <> 'information_schema';
    

    【讨论】:

    • 是的,现在完全可以按预期工作。也来自 pgAdmin 和 .NET。由于我的程序在启动时自动创建了这些功能(如果不存在的话),现在我再次有了干净的情况来捕捉这些功能的备份,而没有任何可靠的工作/问题。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2014-02-27
    • 2015-08-15
    • 2019-07-15
    • 1970-01-01
    • 2017-09-05
    • 2020-02-25
    • 2011-01-03
    • 1970-01-01
    相关资源
    最近更新 更多