はじめに:
廃止された、使用されていないなど、数百のストアド関数を含むPostgreSQLデータベース.
問題
テーブル構造を変更したいので、テーブルXと関係があるすべてのストアド関数を見つける必要があります。一部は使用されていない可能性があるため、コードを確認するだけではそれを行うことはできません。
私がATMを持っているソリューションは、psqlの\df+
とgreppingの出力ですが、情報スキーマを使用するなど、よりデータベースに似た解決策を好みます。これは間違いなく繰り返しの多い作業になるので、それをナイスでクリーンにしたいと思います。
助言がありますか?
関数の本体はstringとして格納されます。参照されるオブジェクトのリストはありません。 (たとえば、参照されるテーブルへの実際のリンクが保存されるビューとは異なります。)
この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では失敗する可能性があり、特にテーブル名が一般的なWordである場合は、誤検出がいくつでも返される可能性があります。
集計関数とシステムスキーマのすべての関数は除外されます。
_\m
_および_\M
_ は、正規表現でWordの開始と終了をマークします。
システムカタログ_pg_proc
_はPostgres 11で変更されました。proisagg
はprokind
に置き換えられ、真のストアドプロシージャが追加されました。適応する必要があります。関連:
このクエリは非常に使いやすいです。
SELECT proname, proargnames, prosrc FROM pg_proc WHERE prosrc ILIKE '%Text to search%';