関数の本体は、文字列として格納されるだけです。参照されるオブジェクトのリストはありません。(たとえば、参照されるテーブルへの実際のリンクが保存されるビューとは異なります。)
Postgres 10以前のこのクエリは、システムカタログ情報関数pg_get_functiondef()
を使用して、CREATE FUNCTION
関連する関数のスクリプトを再構築し、大文字と小文字を区別しない正規表現でテーブル名を検索します。
SELECT n.nspname AS schema_name
, p.proname AS function_name
, pg_get_function_arguments(p.oid) AS args
, pg_get_functiondef(p.oid) AS func_def
FROM pg_proc p
JOIN pg_namespace n ON n.oid = p.pronamespace
WHERE NOT p.proisagg
AND n.nspname NOT LIKE 'pg_%'
AND n.nspname <> 'information_schema'
AND pg_get_functiondef(p.oid) ~* '\mbig\M';
それは仕事をするはずですが、それは明らかに防弾ではありません。テーブル名が動的に生成される動的SQLでは失敗する可能性があり、特にテーブル名が一般的な単語である場合は、いくつもの偽陽性が返される可能性があります。
集計関数とシステムスキーマのすべての関数は除外されます。
\m
そして\M
、正規表現中の単語の最初と最後をマーク。
pg_proc
Postgres 11で変更されたシステムカタログproisagg
はに置き換えられprokind
、真のストアドプロシージャが追加されました。適応する必要があります。関連:
EXECUTE
ような式が見つからないという意味で、完全に堅牢ではあり'mm_'||name_parameter
ません。また、引用符で囲まれた名前"my""table""
や大文字小文字の折り返しでは正しく処理できませんが、ほとんどの人が望むことのほとんどを実行します。