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

PostgreSQLでテーブルを参照するすべてのストアドプロシージャを一覧表示する3つの方法

    PostgreSQLの特定のテーブルを参照するストアドプロシージャのリストを返す3つの例を次に示します。

    information_schema.routines 表示

    information_schema.routinesにクエリを実行できます 定義のいずれかにテーブル名が含まれているかどうかを確認するために表示します。

    例:

    SELECT
        routine_name,
        routine_body,
        routine_definition
    FROM information_schema.routines
    WHERE routine_type = 'PROCEDURE'
    AND routine_schema = 'public'
    AND routine_definition ILIKE '%artists%';

    この例では、ストアドプロシージャのいずれかにartistsというテキストが含まれているかどうかを確認しました。 彼らの定義では。

    ILIKE 演算子は、アクティブなロケールに応じて大文字と小文字を区別しないようにします。これはPostgreSQLの拡張機能であり、SQL標準の一部ではありません。大文字と小文字を区別する一致の場合は、LIKEを使用します 。

    テキストがプロシージャ内にある場合に誤検知を返す可能性があるという意味で、完全ではないことに注意してください。ただし、テーブルではありません。このリスクを軽減するために、おそらくフィルター基準を調整することができます。

    pg_proc カタログ

    pg_catalog.pg_proc カタログには、関数、プロシージャ、集計関数、およびウィンドウ関数に関する情報が格納されます。したがって、次のようにクエリを実行できます。

    SELECT 
        n.nspname AS schema_name,
        p.proname AS function_name,
        pg_get_function_arguments(p.oid) AS arguments,
        p.prosrc AS definition
    FROM pg_proc p
    JOIN pg_namespace n ON n.oid = p.pronamespace
    WHERE p.prokind = 'p'
    AND n.nspname = 'public'
    AND p.prosrc ILIKE '%artists%';

    この場合、カタログをpg_catalog.pg_namespaceで結合します。 publicを使用するプロシージャのみに結果をフィルタリングするカタログ 名前空間。

    または、pg_get_functiondef()を使用することもできます。 定義を取得する関数。この関数は、実際にストアドプロシージャの作成コマンドを再構築します。これは逆コンパイルされた再構成であり、コマンドの元のテキストではありません。これにより、CREATE OR REPLACE PROCEDUREが生成されます。 ストアドプロシージャのステートメント。

    例:

    SELECT 
        n.nspname AS schema_name,
        p.proname AS function_name,
        pg_get_function_arguments(p.oid) AS arguments,
        pg_get_functiondef(p.oid) AS definition
    FROM pg_proc p
    JOIN pg_namespace n ON n.oid = p.pronamespace
    WHERE p.prokind = 'p'
    AND n.nspname = 'public'
    AND p.prosrc ILIKE '%artists%';
    テーブルを参照する特定の行を取得する

    テーブルを参照する行番号を含めるようにクエリを変更できます:

    SELECT *
    FROM (
        SELECT 
            proname AS stored_procedure, 
            row_number() OVER (partition by proname) AS line_number, 
            textline
        FROM (
            SELECT 
                proname, 
                unnest(string_to_array(prosrc, chr(10))) AS textline
            FROM pg_proc p
            JOIN pg_namespace n ON n.oid = p.pronamespace
            WHERE nspname = 'public'
            AND prosrc ILIKE '%artists%'
            ) lines
        ) x
    WHERE textline ILIKE '%artists%';

    この例は、KlinによるStackOverflowの回答に基づいています。


    1. PostgreSQLと認証システムの統合

    2. MySQLENUMタイプと結合テーブル

    3. postgreSQLで配列内部インデックスにアクセスする方法は?

    4. SQLServerデータベースですべての制約違反を見つける方法