如何从所有模式中删除函数

How to drop function from all schemas

我想从我的 Postgres 数据库中的所有模式中删除一个函数。我有大约 200 个模式,(t0000001t0000002t0000003 ...),我真的不想手动完成。

有什么办法吗?

你可以试试这个:

do $$
declare s record;
begin
  for s in select schema_name from information_schema.schemata loop
    execute 'drop function if exists ' || s.schema_name || '.yourfunctionname()';
  end loop;
end; $$;

遍历数百个模式非常效率低下,而该功能可能只存在于其中的几个模式中。

另外DROP FUNCTION可以一次性全部掉落

并且 Postgres 支持函数重载,因此在同一架构中可以存在任意数量的具有相同基本名称但具有不同参数的函数。根据文档:

The argument types to the function must be specified, since several different functions can exist with the same name and different argument lists.

大胆强调我的。

这将删除 所有 具有相同基本名称且调用者可见的函数(否则他无法删除它)。
小心点!

CREATE OR REPLACE FUNCTION f_delfunc(_name text)
  RETURNS void AS
$func$
BEGIN

EXECUTE (
   SELECT string_agg(format('DROP FUNCTION %s(%s);'
                     ,oid::regproc
                     ,pg_catalog.pg_get_function_identity_arguments(oid))
          ,E'\n')
   FROM   pg_proc
   WHERE  proname = _name
   AND    pg_function_is_visible(oid));

END
$func$ LANGUAGE plpgsql;

更详细的相关回答:

  • DROP FUNCTION without knowing the number/type of parameters?