web-dev-qa-db-ja.com

PostgreSQL:特定のテーブルにアクセスするすべてのストアド関数を一覧表示する方法

はじめに:

廃止された、使用されていないなど、数百のストアド関数を含むPostgreSQLデータベース.

問題

テーブル構造を変更したいので、テーブルXと関係があるすべてのストアド関数を見つける必要があります。一部は使用されていない可能性があるため、コードを確認するだけではそれを行うことはできません。

私がATMを持っているソリューションは、psqlの\df+とgreppingの出力ですが、情報スキーマを使用するなど、よりデータベースに似た解決策を好みます。これは間違いなく繰り返しの多い作業になるので、それをナイスでクリーンにしたいと思います。

助言がありますか?

13

関数の本体は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で変更されました。proisaggprokindに置き換えられ、真のストアドプロシージャが追加されました。適応する必要があります。関連:

18

このクエリは非常に使いやすいです。

SELECT proname, proargnames, prosrc FROM pg_proc WHERE prosrc ILIKE '%Text to search%';