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

时间:2015-04-02 11:43:30

标签: sql postgresql plpgsql dynamic-sql ddl

我想从Postgres数据库中的所有模式中删除一个函数。我有~200个架构,(t0000001t0000002t0000003 ...)我真的不想手动执行。

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:2)

你可以试试这个:

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; $$;

答案 1 :(得分:2)

循环遍历数百个模式,非常效率低下,而函数可能只存在于其中一些模式中。

此外DROP FUNCTION可以立即删除所有这些内容。

Postgres支持函数重载,因此在同一模式中具有相同基本名称但具有不同参数的任何数量的函数都可以存在。每个文档:

  

必须指定函数的参数类型,因为有几个   不同的函数可以存在同名和不同的参数列表。

大胆强调我的。

这将删除所有函数,这些函数具有调用者可见的相同基本名称(否则无论如何都无法将其删除)。
小心!

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;

相关答案以及更多细节: