基本的なクエリ
このクエリは、必要なすべての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
内の関数に制限します ("見える")。これが必要な場合と不要な場合があります。
複数のスキーマに同じ名前の複数の関数がある場合、またはさまざまな関数引数を持つオーバーロードされた関数がある場合は、すべて それらのうち、個別にリストされます。特定のスキーマまたは特定の関数パラメーターに制限することをお勧めします。
関連:
- 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のパラメータ化されたOrderBy/ Limit in table function
regproc
を使用する関数の9.1より古いバージョンまたは古いバリアントのPostgresバージョンの場合 およびpg_get_function_identity_arguments(oid)
この回答の編集履歴を確認してください。