sql >> データベース >  >> RDS >> PostgreSQL

パラメータの数/タイプを知らなくても機能を削除しますか?

    基本的なクエリ

    このクエリは、必要なすべての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) この回答の編集履歴を確認してください。



    1. SQLServerのLIMIT10..20

    2. SQLServerのトリガーイベントタイプの階層リストを返すクエリ

    3. SQLServerのテーブル値関数を介してデータを更新する

    4. .dbファイルを別の.apkandroidに添付する方法