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.