Saltar al contenido

¿Cómo eliminar todas mis funciones en PostgreSQL?

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 reemplaza proisagg y proiswindow – 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *