sql >> Databasteknik >  >> RDS >> PostgreSQL

DROP FUNCTION utan att veta antalet/typ av parametrar?

Grundläggande fråga

Den här frågan skapar alla nödvändiga DDL-satser:

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

Utdata:

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

Utför kommandona efter att ha kontrollerat rimligheten.

Skicka funktionsnamnet skiftlägeskänsligt och utan tillagda dubbla citattecken att matcha mot pg_proc.proname .

Cast till objektidentifieraren typ regprocedure (oid::regprocedure ), och sedan till text producerar implicit funktionsnamn med argumenttyper, automatiskt dubbla citattecken och schemakvalificerade enligt den nuvarande search_path där det behövs. Ingen SQL-injektion möjligt.

pg_function_is_visible(oid) begränsar valet till funktioner i den aktuella search_path ("synlig"). Du kanske vill ha detta eller inte.

Om du har flera funktioner med samma namn i flera scheman, eller överbelastade funktioner med olika funktionsargument, alla av dessa kommer att listas separat. Du kanske vill begränsa till specifika schema(n) eller specifika funktionsparametrar.

Relaterat:

  • När/hur är funktioner för standardvärdeuttryck bundna med avseende på sökväg?

Funktion

Du kan bygga en plpgsql funktion kring detta för att exekvera satserna omedelbart med EXECUTE . För Postgres 9.1 eller senare:Försiktigt! Det tar bort dina funktioner!

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

Ring:

SELECT f_delfunc('my_function_name');

Funktionen returnerar antalet funktioner som hittats och tappats om inga undantag höjs. 0 om ingen hittades.

Mer läsning:

  • Hur påverkar sökvägen identifierarens upplösning och det "aktuella schemat"
  • Trunkerar alla tabeller i en Postgres-databas
  • PostgreSQL-parameteriserad Ordning efter / Limit i tabellfunktion

För Postgres-versioner äldre än 9.1 eller äldre varianter av funktionen som använder regproc och pg_get_function_identity_arguments(oid) kontrollera redigeringshistoriken för det här svaret.



  1. Använder funktionen COALESCE för att göra värden separerade med kommatecken

  2. Kontrollera om en användardefinierad typ redan finns i PostgreSQL

  3. MySQL - välj data från databasen mellan två datum

  4. DB-migrering med NextForm Multi-Table Wizard