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


13

前書き:

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

問題

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

ATMを使用するソリューションは、psql \df+とgreppingの出力を実行していますが、情報スキーマを使用するなど、よりデータベースに似たソリューションを使用したいと思います。これは間違いなく繰り返しの多い作業になるので、きれいにしてください。

助言がありますか?

回答:


18

関数の本体は、文字列として格納されるだけです。参照されるオブジェクトのリストはありません。(たとえば、参照されるテーブルへの実際のリンクが保存されるビューとは異なります。)

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_procPostgres 11で変更されたシステムカタログproisaggはに置き換えられprokind、真のストアドプロシージャが追加されました。適応する必要があります。関連:


1
うん...のEXECUTEような式が見つからないという意味で、完全に堅牢ではあり'mm_'||name_parameterません。また、引用符で囲まれた名前"my""table""や大文字小文字の折り返しでは正しく処理できませんが、ほとんどの人が望むことのほとんどを実行します。
クレイグリンガー2013

@CraigRinger:ええ、動的クエリEXECUTEをカバーすることはほとんど不可能です。ただし、大文字と小文字の折りたたみは、~*代わりに~-または他の大文字と小文字を区別しないパターンマッチングでカバーできます。
Erwin Brandstetter 2013

だから、長いオペレータが狂っ実際にという名前のテーブルを作成するのに十分ではないと"MyTable"してMyTableだ正直、少なくとも、...と、「許されるかもしれない井戸が、それはスマートではありません」動きます。
クレイグリンガー2013

答えてくれてありがとう!私は実際に動的テーブル名の構築をどこでも使用せず、すべてのテーブル名は小文字です。
セルゲイKudriavtsev 2013

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.