批量删除函数
假设您有一堆需要删除的函数 - 没有简单的 SQL 命令可以做到这一点,但将一个可以动态生成适当语句的 PL/pgSQL 代码片段组合在一起非常容易。
关键是使用 pg_get_function_arguments()
函数,该函数将为每个函数生成适当的参数,然后可以将其传递给 DROP FUNCTION
命令。
DO $$ DECLARE rec RECORD; BEGIN FOR rec IN SELECT n.nspname || '.' || p.proname || '(' || pg_catalog.pg_get_function_arguments(p.oid) ||')' AS func FROM pg_catalog.pg_proc p LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace WHERE p.proname LIKE 'foo%' LOOP RAISE NOTICE 'Dropping: %', rec.func; EXECUTE 'DROP FUNCTION ' || rec.func; END LOOP; END; $$;
给定以下函数
postgres# \df foo List of functions Schema | Name | Result data type | Argument data types | Type --------+------+------------------+---------------------+------ public | foo | integer | integer | func public | foo | integer | integer, integer | func (2 rows)
执行上述代码片段将产生
postgres# DO $$ ... $$; NOTICE: Dropping: public.foo(integer) NOTICE: Dropping: public.foo(integer, integer)
此技术可用于执行其他批量操作,例如更改所有权(但另请参阅 REASSIGN OWNED
)。