批量删除函数
假设您有一堆需要删除的函数——没有简单的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
)。