sql >> Base de Datos >  >> RDS >> PostgreSQL

DROP FUNCTION sin conocer el número/tipo de parámetros?

Consulta básica

Esta consulta crea todas las declaraciones DDL necesarias:

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

Salida:

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);

Ejecute los comandos después de verificar la plausibilidad.

Pase el nombre de la función sensible a mayúsculas y minúsculas y sin comillas dobles para hacer coincidir con pg_proc.proname .

La conversión al tipo de identificador de objeto regprocedure (oid::regprocedure ), y luego a text implícitamente, produce nombres de funciones con tipos de argumentos, automáticamente entre comillas dobles y calificados según el esquema de acuerdo con el search_path actual donde sea necesario Sin inyección SQL posible.

pg_function_is_visible(oid) restringe la selección a funciones en el search_path actual ("visible"). Puede o no querer esto.

Si tiene varias funciones con el mismo nombre en varios esquemas o funciones sobrecargadas con varios argumentos de función, todas de ellos se enumerarán por separado. Es posible que desee restringir a esquemas específicos o parámetros de función específicos.

Relacionado:

  • ¿Cuándo/cómo se vinculan las funciones de expresión de valor predeterminado con respecto a search_path?

Función

Puede construir un plpgsql función alrededor de esto para ejecutar las declaraciones inmediatamente con EXECUTE . Para Postgres 9.1 o posterior:¡Cuidado! ¡Deja tus funciones!

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$;

Llamar:

SELECT f_delfunc('my_function_name');

La función devuelve el número de funciones encontradas y eliminadas si no se generan excepciones. 0 si no se encontró ninguno.

Lectura adicional:

  • ¿Cómo influye search_path en la resolución del identificador y el "esquema actual"?
  • Truncando todas las tablas en una base de datos de Postgres
  • PostgreSQL parametrizado Ordenar por/Límite en función de tabla

Para versiones de Postgres anteriores a la 9.1 o variantes anteriores de la función usando regproc y pg_get_function_identity_arguments(oid) revisa el historial de edición de esta respuesta.