PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

DROP FUNCTION sem saber o número/tipo de parâmetros?

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.