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の回答に基づいています。