PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

DROP FUNCTION без да знаете броя/вида на параметрите?

Основна заявка

Тази заявка създава всички необходими DDL изрази:

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

Изход:

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

Изпълнете командите, след като проверите достоверността.

Предайте името на функцията съсчитано с малки букви и без добавени двойни кавички за съвпадение срещу pg_proc.proname .

Прехвърлянето към идентификатора на обекта тип regprocedure (oid::regprocedure ), а след това към text имплицитно, създава имена на функции с типове аргументи, автоматично в двойни кавички и квалифицирани по схема според текущия search_path където е необходимо. Без SQL инжекция възможно.

pg_function_is_visible(oid) ограничава селекцията до функции в текущия search_path („видимо“). Може да искате или да не искате това.

Ако имате множество функции с едно и също име в множество схеми или претоварени функции с различни функционални аргументи, всички от тях ще бъдат изброени отделно. Може да искате да ограничите до конкретна схема(и) или специфичен(и) параметър(и) на функцията.

Свързано:

  • Кога/как се обвързват функциите за израз на стойност по подразбиране по отношение на пътя_търсене?

Функция

Можете да създадете plpgsql функция около това, за да изпълни операторите незабавно с EXECUTE . За Postgres 9.1 или по-късно:Внимание! Отпада функциите ви!

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

Обадете се:

SELECT f_delfunc('my_function_name');

Функцията връща броя на функциите, намерени и изпуснати, ако не са повдигнати изключения. 0 ако не е намерен нито един.

Допълнително четене:

  • Как search_path влияе върху разделителната способност на идентификатора и „текущата схема“
  • Отрязване на всички таблици в база данни на Postgres
  • PostgreSQL параметризирана поръчка по/ограничение във функцията на таблицата

За версии на Postgres, по-стари от 9.1 или по-стари варианти на функцията, използвайки regproc и pg_get_function_identity_arguments(oid) проверете историята на редактирането на този отговор.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как cbrt() работи в PostgreSQL

  2. PHP и Postgres:улавяне на грешки?

  3. Връзката, предадена на # или трябва да е структурно съвместима. Несъвместими стойности:[:references]

  4. postgreSQL - psql \i :как да изпълним скрипт в даден път

  5. PostgreSQL 12:Външни ключове и разделени таблици