【发布时间】:2015-06-07 08:37:56
【问题描述】:
我想从我的 Postgres 数据库中的所有模式中删除一个函数。我有大约 200 个模式(t0000001、t0000002、t0000003 ...),我真的不想手动操作。
有什么办法吗?
【问题讨论】:
标签: sql postgresql plpgsql dynamic-sql ddl
我想从我的 Postgres 数据库中的所有模式中删除一个函数。我有大约 200 个模式(t0000001、t0000002、t0000003 ...),我真的不想手动操作。
有什么办法吗?
【问题讨论】:
标签: sql postgresql plpgsql dynamic-sql ddl
循环遍历数百个模式会非常效率低下,而函数可能只存在于其中的几个模式中。
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;
更多细节的相关答案:
【讨论】:
你可以试试这个:
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; $$;
【讨论】: