Основной запрос
Этот запрос создает все необходимые операторы DDL (упрощено с приведением к regprocedure
):
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 ..
-- .. you may or may not want this
Выход:
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);
Выполнить команды (после проверки достоверности).
Имя функции чувствительно к регистру и без добавления двойных кавычек при передаче в качестве параметра text
для сопоставления с pg_proc.proname
.
Приведение к идентификатору объекта типа regprocedure
(oid::regprocedure
) делает все идентификаторы безопасными от внедрения SQL (с помощью вредоносных искаженных идентификаторов). При преобразовании в text
имя функции указывается в двойных кавычках и автоматически указывается в соответствии с текущим значением search_path
.
pg_function_is_visible(oid)
ограничивает выбор функциями в текущем search_path
. Вы можете или не можете этого хотеть. При наличии условия pg_function_is_visible(oid)
функция гарантированно будет видимой.
Если у вас есть несколько функций с одним и тем же именем в нескольких схемах или перегружены функции с различными аргументами функций, все из них будут перечислены отдельно. Вы можете хотеть ограничиться определенной схемой (схемами) или определенным параметром (ами) функции в конце концов.
Связанный:
Функция
Вы можете построить plpgsql
функцию вокруг этого для немедленного выполнения операторов с помощью EXECUTE
. Для Postgres 9.1 или более поздней версии:
Осторожно! Это отбрасывает ваши функции!
CREATE OR REPLACE FUNCTION f_delfunc(_name text, OUT func_dropped int) AS
$func$
DECLARE
_sql text;
BEGIN
SELECT count(*)::int
, 'DROP FUNCTION ' || string_agg(oid::regprocedure::text, '; DROP FUNCTION ')
FROM pg_proc
WHERE proname = _name
AND pg_function_is_visible(oid)
INTO func_dropped, _sql; -- only returned if trailing DROPs succeed
IF func_dropped > 0 THEN -- only if function(s) found
EXECUTE _sql;
END IF;
END
$func$ LANGUAGE plpgsql;
Звоните:
SELECT * FROM f_delfunc('my_function_name');
Или просто:
SELECT f_delfunc('my_function_name');
Таким образом, вы не получите столбец name func_dropped
для столбца результата. Может не иметь значения для вас.
Функция возвращает количество найденных и удаленных функций (исключений не возникло) - 0
, если ни одна не была найдена.
Предполагается (по умолчанию) search_path
, где pg_catalog
не было перемещено.
Больше в этих связанных ответах:
Для версий Postgres старше 9.1 или более старых вариантов функции с использованием regproc
и pg_get_function_identity_arguments(oid)
проверьте историю редактирования этого ответа.