Postgres има специална функция за тази цел. Въведено с Postgres 8.4. Ръководството:
pg_get_function_identity_arguments(func_oid)
... вземете списък с аргументи за идентифициране на функция (без стойности по подразбиране) ...
pg_get_function_identity_arguments
връща аргумента list, необходим за идентифициране на функция, във формата, която трябва да се появи вALTER FUNCTION
, например. Този формуляр пропуска стойностите по подразбиране.
Използвайки това (и format()
, въведен с Postgres 9.1), следната заявка генерира DDL изрази за премахване на функции, съответстващи на вашите думи за търсене:
SELECT format('DROP %s %I.%I(%s);'
, CASE WHEN p.proisagg THEN 'AGGREGATE' ELSE 'FUNCTION' END
, n.nspname
, p.proname
, pg_catalog.pg_get_function_identity_arguments(p.oid)
) AS stmt
FROM pg_catalog.pg_proc p
JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE p.proname = 'dblink' -- function name
-- AND n.nspname = 'public' -- schema name (optional)
-- AND pg_catalog.pg_function_is_visible(p.oid) -- function visible to user
ORDER BY 1;
Системният каталог pg_proc
променено в Postgres 11 . proisagg
беше заменен с prokind
, бяха добавени истински съхранени процедури. Трябва да се адаптирате. Вижте:
- Как да премахна всичките си функции в PostgreSQL?
Връща:
stmt
---------------------------------------------------
DROP FUNCTION public.dblink(text);
DROP FUNCTION public.dblink(text, boolean);
DROP FUNCTION public.dblink(text, text);
DROP FUNCTION public.dblink(text, text, boolean);
В примера бяха намерени четири съвпадения, защото dblink използва претоварени функции.
Изпълнете DROP
изявления избирателно!
Алтернативно , можете да използвате удобното прехвърляне към тип идентификатор на обект regprocedure
който връща пълен подпис на функцията, включително типове аргументи:
-- SET LOCAL search_path = ''; -- optional, to get all names schema-qualified
SELECT format('DROP %s %s;'
, CASE WHEN proisagg THEN 'AGGREGATE' ELSE 'FUNCTION' END
, oid::regprocedure
) AS stmt
FROM pg_catalog.pg_proc
WHERE proname = 'dblink' -- function name
ORDER BY 1;