sql >> Database >  >> RDS >> PostgreSQL

DROP-FUNCTIE zonder het aantal/type parameters te kennen?

Basisquery

Deze query creëert alle benodigde DDL-statements:

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

Uitgang:

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

Voer de commando's uit nadat de aannemelijkheid is gecontroleerd.

Geef de functienaam door hoofdlettergevoelig en zonder toegevoegde dubbele aanhalingstekens om te matchen met pg_proc.proname .

De cast naar het object-ID type regprocedure (oid::regprocedure ), en dan naar text produceert impliciet functienamen met argumenttypes, automatisch dubbele aanhalingstekens en schema-gekwalificeerd volgens het huidige search_path waar nodig. Geen SQL-injectie mogelijk.

pg_function_is_visible(oid) beperkt de selectie tot functies in het huidige search_path ("zichtbaar"). Misschien wil je dit wel of niet.

Als u meerdere functies met dezelfde naam in meerdere schema's hebt, of overbelaste functies met verschillende functieargumenten, allemaal daarvan worden apart vermeld. Misschien wilt u zich beperken tot specifieke schema('s) of specifieke functieparameter(s).

Gerelateerd:

  • Wanneer / hoe zijn standaardwaarde-expressiefuncties gebonden met betrekking tot zoekpad?

Functie

U kunt een plpgsql . bouwen functie hier omheen om de instructies onmiddellijk uit te voeren met EXECUTE . Voor Postgres 9.1 of later:Pas op! Het laat je functies vallen!

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

Bel:

SELECT f_delfunc('my_function_name');

De functie retourneert het aantal gevonden en verwijderde functies als er geen uitzonderingen worden gemaakt. 0 als er geen werd gevonden.

Verder lezen:

  • Hoe beïnvloedt het zoekpad de resolutie van de ID en het "huidige schema"
  • Alle tabellen in een Postgres-database afkappen
  • PostgreSQL-geparametriseerde Order By / Limit in tabelfunctie

Voor Postgres-versies ouder dan 9.1 of oudere varianten van de functie die regproc gebruiken en pg_get_function_identity_arguments(oid) controleer de bewerkingsgeschiedenis van dit antwoord.



  1. DECOMPOSE() Functie in Oracle

  2. Hoe WEIGHT_STRING() werkt in MariaDB

  3. PostgreSQL - Sleutel toevoegen aan elk object van een JSONB-array

  4. SqlBulkKopieer uit een lijst<>