Consulta básica
Esta consulta cria todas as instruções DDL necessárias:
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
Saída:
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);
Execute os comandos após verificar a plausibilidade.
Passe o nome da função diferencia maiúsculas de minúsculas e sem aspas duplas adicionadas para corresponder a
pg_proc.proname
. A conversão para o tipo de identificador de objeto
regprocedure
(oid::regprocedure
) e, em seguida, para text
implicitamente, produz nomes de funções com tipos de argumentos, automaticamente entre aspas duplas e qualificados pelo esquema de acordo com o search_path
atual onde necessário. Sem injeção de SQL possível. pg_function_is_visible(oid)
restringe a seleção a funções no search_path
atual ("visível"). Você pode ou não querer isso. Se você tiver várias funções com o mesmo nome em vários esquemas ou funções sobrecarregadas com vários argumentos de função, todos desses serão listados separadamente. Você pode querer restringir a esquema(s) específico(s) ou parâmetro(s) de função específico(s).
Relacionado:
- Quando/como as funções de expressão de valor padrão são vinculadas em relação a search_path?
Função
Você pode construir um
plpgsql
função em torno disso para executar as instruções imediatamente com EXECUTE
. Para Postgres 9.1 ou posterior:Cuidado! Ele descarta suas funções! 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$;
Ligar:
SELECT f_delfunc('my_function_name');
A função retorna o número de funções encontradas e descartadas se nenhuma exceção for levantada.
0
se nenhum foi encontrado. Leitura adicional:
- Como o search_path influencia a resolução do identificador e o "esquema atual"
- Truncar todas as tabelas em um banco de dados Postgres
- PostgreSQL parametrizado Ordem por / Limite na função de tabela
Para versões do Postgres anteriores a 9.1 ou variantes anteriores da função usando
regproc
e pg_get_function_identity_arguments(oid)
verifique o histórico de edições desta resposta.