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.