【问题标题】:How to drop function from all schemas如何从所有模式中删除功能
【发布时间】:2015-06-07 08:37:56
【问题描述】:

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

有什么办法吗?

【问题讨论】:

    标签: sql postgresql plpgsql dynamic-sql ddl


    【解决方案1】:

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

    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;
    

    更多细节的相关答案:

    【讨论】:

      【解决方案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; $$;
      

      【讨论】:

        猜你喜欢
        • 2019-01-04
        • 1970-01-01
        • 1970-01-01
        • 2018-03-31
        • 2018-08-13
        • 1970-01-01
        • 2015-05-02
        • 1970-01-01
        • 2021-04-22
        相关资源
        最近更新 更多