Основна заявка
Тази заявка създава всички необходими DDL изрази:
SELECT 'DROP FUNCTION ' || oid::regprocedure
FROM pg_proc
WHERE proname = 'my_function_name' -- name without schema-qualification
AND pg_function_is_visible(oid); -- restrict to current search_path
Изход:
DROP FUNCTION my_function_name(string text, form text, maxlen integer);
DROP FUNCTION my_function_name(string text, form text);
DROP FUNCTION my_function_name(string text);
Изпълнете командите, след като проверите достоверността.
Предайте името на функцията съсчитано с малки букви и без добавени двойни кавички за съвпадение срещу pg_proc.proname
.
Прехвърлянето към идентификатора на обекта тип regprocedure
(oid::regprocedure
), а след това към text
имплицитно, създава имена на функции с типове аргументи, автоматично в двойни кавички и квалифицирани по схема според текущия search_path
където е необходимо. Без SQL инжекция възможно.
pg_function_is_visible(oid)
ограничава селекцията до функции в текущия search_path
(„видимо“). Може да искате или да не искате това.
Ако имате множество функции с едно и също име в множество схеми или претоварени функции с различни функционални аргументи, всички от тях ще бъдат изброени отделно. Може да искате да ограничите до конкретна схема(и) или специфичен(и) параметър(и) на функцията.
Свързано:
- Кога/как се обвързват функциите за израз на стойност по подразбиране по отношение на пътя_търсене?
Функция
Можете да създадете plpgsql
функция около това, за да изпълни операторите незабавно с EXECUTE
. За Postgres 9.1 или по-късно:Внимание! Отпада функциите ви!
CREATE OR REPLACE FUNCTION f_delfunc(_name text, OUT functions_dropped int)
LANGUAGE plpgsql AS
$func$
-- drop all functions with given _name in the current search_path, regardless of function parameters
DECLARE
_sql text;
BEGIN
SELECT count(*)::int
, 'DROP FUNCTION ' || string_agg(oid::regprocedure::text, '; DROP FUNCTION ')
FROM pg_catalog.pg_proc
WHERE proname = _name
AND pg_function_is_visible(oid) -- restrict to current search_path
INTO functions_dropped, _sql; -- count only returned if subsequent DROPs succeed
IF functions_dropped > 0 THEN -- only if function(s) found
EXECUTE _sql;
END IF;
END
$func$;
Обадете се:
SELECT f_delfunc('my_function_name');
Функцията връща броя на функциите, намерени и изпуснати, ако не са повдигнати изключения. 0
ако не е намерен нито един.
Допълнително четене:
- Как search_path влияе върху разделителната способност на идентификатора и „текущата схема“
- Отрязване на всички таблици в база данни на Postgres
- PostgreSQL параметризирана поръчка по/ограничение във функцията на таблицата
За версии на Postgres, по-стари от 9.1 или по-стари варианти на функцията, използвайки regproc
и pg_get_function_identity_arguments(oid)
проверете историята на редактирането на този отговор.