PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

DROP FUNCTION tanpa mengetahui jumlah/jenis parameter?

Kueri dasar

Kueri ini membuat semua pernyataan DDL yang diperlukan:

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

Keluaran:

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

Jalankan perintah setelah memeriksa kemungkinannya.

Berikan nama fungsi peka huruf besar kecil dan tanpa tanda kutip ganda tambahan untuk mencocokkan dengan pg_proc.proname .

Cast ke tipe pengidentifikasi objek regprocedure (oid::regprocedure ), lalu ke text secara implisit, menghasilkan nama fungsi dengan tipe argumen, secara otomatis dikutip ganda dan memenuhi syarat skema sesuai dengan search_path saat ini di mana diperlukan. Tidak ada injeksi SQL mungkin.

pg_function_is_visible(oid) membatasi pilihan ke fungsi dalam search_path saat ini ("bisa dilihat"). Anda mungkin atau mungkin tidak menginginkan ini.

Jika Anda memiliki beberapa fungsi dengan nama yang sama dalam beberapa skema, atau fungsi yang kelebihan beban dengan berbagai argumen fungsi, semua dari mereka akan terdaftar secara terpisah. Anda mungkin ingin membatasi skema tertentu atau parameter fungsi tertentu.

Terkait:

  • Kapan / bagaimana fungsi ekspresi nilai default terikat sehubungan dengan jalur_pencarian?

Fungsi

Anda dapat membuat plpgsql fungsi di sekitar ini untuk mengeksekusi pernyataan segera dengan EXECUTE . Untuk Postgres 9.1 atau lebih baru:Hati-hati! Itu menjatuhkan fungsi Anda!

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

Telepon:

SELECT f_delfunc('my_function_name');

Fungsi mengembalikan jumlah fungsi yang ditemukan dan dijatuhkan jika tidak ada pengecualian yang dimunculkan. 0 jika tidak ada yang ditemukan.

Bacaan lebih lanjut:

  • Bagaimana search_path mempengaruhi resolusi pengenal dan "skema saat ini"
  • Memotong semua tabel dalam database Postgres
  • PostgreSQL diparameterisasi Urutan Menurut / Batas dalam fungsi tabel

Untuk versi Postgres yang lebih lama dari 9.1 atau varian fungsi yang lebih lama menggunakan regproc dan pg_get_function_identity_arguments(oid) periksa riwayat edit jawaban ini.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Peningkatan Pelaporan Kemajuan di PostgreSQL 12

  2. Menggunakan waktu saat ini di UTC sebagai nilai default di PostgreSQL

  3. Blok kode anonim PL/pgSQL

  4. Django-DB-Migrations:tidak dapat MENGUBAH TABLE karena memiliki peristiwa pemicu yang tertunda

  5. Memetakan tipe serial PostgreSQL dengan anotasi Hibernate