Buscamos por distintos espacios y así brindarte la respuesta a tu problema, si tienes inquietudes puedes dejar la pregunta y contestamos porque estamos para servirte.
Solución:
Para descartar todas las funciones (incluidos los agregados) en un esquema determinado (ten cuidado con esto!):
Postgres 11 o posterior
- Se han añadido procedimientos.
- El catálogo del sistema
pg_proc
ligeramente cambiado:prokind
reemplazaproisagg
yproiswindow
– y también etiquetas funciones y el nuevo procedimientos
DO
$do$
DECLARE
_sql text;
BEGIN
SELECT INTO _sql
string_agg(format('DROP %s %s;'
, CASE prokind
WHEN 'f' THEN 'FUNCTION'
WHEN 'a' THEN 'AGGREGATE'
WHEN 'p' THEN 'PROCEDURE'
WHEN 'w' THEN 'FUNCTION' -- window function (rarely applicable)
-- ELSE NULL -- not possible in pg 11
END
, oid::regprocedure)
, E'n')
FROM pg_proc
WHERE pronamespace = 'public'::regnamespace -- schema name here!
-- AND prokind = ANY ('f,a,p,w') -- optionally filter kinds
;
IF _sql IS NOT NULL THEN
RAISE NOTICE '%', _sql; -- debug / check first
-- EXECUTE _sql; -- uncomment payload once you are sure
ELSE
RAISE NOTICE 'No fuctions found in schema %', quote_ident(_schema);
END IF;
END
$do$;
El nombre del esquema distingue entre mayúsculas y minúsculas en este contexto.
El rol de ejecución debe tener los privilegios necesarios, por supuesto.
podrías agregar CASCADE
como lo demostró mehmet, pero eso también eliminará objetos dependientes, de forma recursiva, no solo funciones. Lo hace aún más peligroso. Será mejor que sepas exactamente lo que estás haciendo.
Relacionado, con más explicación:
- Cómo eliminar la función de todos los esquemas
- DROP FUNCTION sin conocer el número/tipo de parámetros?
Postgres 10 o anterior
DO
$do$
DECLARE
_sql text;
BEGIN
SELECT INTO _sql
string_agg(format('DROP %s %s;'
, CASE WHEN proisagg THEN 'AGGREGATE' ELSE 'FUNCTION' END
, oid::regprocedure)
, E'n')
FROM pg_proc
WHERE pronamespace = 'public'::regnamespace; -- schema name here!
IF _sql IS NOT NULL THEN
RAISE NOTICE '%', _sql; -- debug / check first
-- EXECUTE _sql; -- uncomment payload once you are sure
ELSE
RAISE NOTICE 'No fuctions found in schema %', quote_ident(_schema);
END IF;
END
$do$;
Tuve que retocar la respuesta de Erwin anterior para varios casos:
1) Si tenía una función agregada en el esquema que activó y produjo un error. 2) Si quería eliminar funciones en dos esquemas y la función que elimina está en el primero, también se eliminó. 3) Si las funciones dependieran unas de otras. Utilice la cascada para forzar la caída.
Aquí está:
create or replace function data.delete_all_functions(schema_in text)
returns void as
$$
declare
qry text;
begin
select into qry string_agg(
format(
case when proname = 'delete_all_functions' then '-- %s;' -- don't delete self
when proisagg then 'drop aggregate if exists %s cascade;'
else 'drop function if exists %s cascade;'
end,
oid :: regprocedure
),
E'n'
)
from pg_proc
where pronamespace = schema_in :: regnamespace;
if qry is not null then
execute qry;
raise notice 'deleted all functions in schema: %', schema_in;
else
raise notice 'no functions to delete in schema: %', schema_in;
end if;
end
$$
language plpgsql;
valoraciones y comentarios
Finalizando este artículo puedes encontrar los informes de otros creadores, tú además tienes la habilidad dejar el tuyo si lo crees conveniente.