sql >> Database teknologi >  >> RDS >> PostgreSQL

DROP FUNKTION uden at kende antallet/typen af ​​parametre?

Grundlæggende forespørgsel

Denne forespørgsel opretter alle nødvendige DDL-sætninger:

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

Output:

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

Udfør kommandoerne efter at have kontrolleret plausibiliteten.

Send funktionsnavnet skifter mellem store og små bogstaver og uden tilføjede dobbelte anførselstegn at matche mod pg_proc.proname .

Castet til objektidentifikatortypen regprocedure (oid::regprocedure ), og derefter til text producerer implicit funktionsnavne med argumenttyper, automatisk dobbeltciteret og skema-kvalificeret i henhold til den aktuelle search_path hvor det er nødvendigt. Ingen SQL-injektion muligt.

pg_function_is_visible(oid) begrænser valget til funktioner i den aktuelle search_path ("synlig"). Du ønsker måske eller ikke ønsker dette.

Hvis du har flere funktioner af samme navn i flere skemaer eller overbelastede funktioner med forskellige funktionsargumenter, alle af disse vil blive opført separat. Du ønsker måske at begrænse til specifikke skema(er) eller specifikke funktionsparametre.

Relateret:

  • Hvornår/hvordan er standardværdiudtryksfunktioner bundet med hensyn til søgesti?

Funktion

Du kan bygge en plpgsql funktion omkring dette for at udføre sætningerne med det samme med EXECUTE . Til Postgres 9.1 eller senere:Forsigtig! Det taber dine 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 til:

SELECT f_delfunc('my_function_name');

Funktionen returnerer antallet af funktioner, der er fundet og slettet, hvis der ikke er nogen undtagelser. 0 hvis ingen blev fundet.

Yderligere læsning:

  • Hvordan påvirker søgestien identifikationsopløsning og det "aktuelle skema"
  • Trunkering af alle tabeller i en Postgres-database
  • PostgreSQL parametriseret rækkefølge efter / grænse i tabelfunktion

For Postgres-versioner ældre end 9.1 eller ældre varianter af funktionen ved hjælp af regproc og pg_get_function_identity_arguments(oid) tjek redigeringshistorikken for dette svar.



  1. Brug af OAuth til at godkende din ODBC-forbindelse til Salesforce.com

  2. Hvordan gendanner man en enkelt tabel fra en .sql postgresql backup?

  3. Opdater en databasemailprofil (SSMS)

  4. dvale dialekt for oracle 12c