postgresqlで関数、プロシージャ、トリガーのソースコードを表示する方法は?


168

postgresqlで関数を出力してソースコードをトリガーする方法は?誰かが関数を表示するためのクエリを知っていて、ソースコードをトリガーする場合はお知らせください。


11
すべてのトリガーを一覧表示する方法を理解しようとここに来たフォロワーのためのメモとして、select * from pg_trigger;または、各トリガーがselect tgrelid::regclass, tgname from pg_trigger;FWIWに適用されるテーブルも確認する場合は、`
rogerdpack

回答:


152

\df+中にはpsqlあなたにソースコードを提供します。


17
いいですね:) \df関数の名前を見つけるためにを使用し、次に\x拡張出力を使用することをお勧めします\df+ name_of_function
Sam Watkins

33
\ df +はコードよりもはるかに多くを出力します。必要なのがコードだけなら、\ sfがうまくいきます!
Telic

インストールされているEXTENSIONの機能を確認するには?ltreeを使用していますが、での応答はありません\df ltxtquery
Peter Krauss、

\x ON転置表示には必須です
andilabs

130

機能について:

次のように、pg_procビューをクエリできます

select proname,prosrc from pg_proc where proname= your_function_name; 

もう1つの方法は、コモント\dfを実行するだけで\ef、関数を一覧表示できることです。

skytf=> \df           
                                             List of functions
 Schema |         Name         | Result data type |              Argument data types               |  Type  
--------+----------------------+------------------+------------------------------------------------+--------
 public | pg_buffercache_pages | SETOF record     |                                                | normal


skytf=> \ef  pg_buffercache_pages

関数のソースコードが表示されます。

トリガーの場合:

ソースコードを直接入手する方法があるかどうかわかりません。ちょうど次の方法を知っている、それがあなたを助けるかもしれません!

  • ステップ1:トリガーのテーブルOIDを取得します。
    skytf => pg_triggerからtgrelidを選択します。ここでtgname = 'insert_tbl_tmp_trigger';
      tgrelid
    ---------
       26599
    (1列)
  • ステップ2:上記のoidのテーブル名を取得します!
    skytf => select oid、relname from pg_class where oid = 26599;
      oid | relname           
    ------- + -----------------------------
     26599 | tbl_tmp
    (1列)
  • ステップ3:テーブル情報を一覧表示する
    skytf => \ d tbl_tmp

テーブルのトリガーの詳細が表示されます。通常、トリガーは関数を使用します。したがって、上記で指摘したように、トリガー関数のソースコードを取得できます。


38

PostgreSQL-9.5の例をいくつか示します

表示リスト:

  1. 関数: \df+
  2. トリガー: \dy+

ディスプレイ定義:

postgres=# \sf
function name is required

postgres=# \sf pg_reload_conf()
CREATE OR REPLACE FUNCTION pg_catalog.pg_reload_conf()
 RETURNS boolean
 LANGUAGE internal
 STRICT
AS $function$pg_reload_conf$function$

postgres=# \sf pg_encoding_to_char
CREATE OR REPLACE FUNCTION pg_catalog.pg_encoding_to_char(integer)
 RETURNS name
 LANGUAGE internal
 STABLE STRICT
AS $function$PG_encoding_to_char$function$

7
\xfirstを使用して拡張表示をオンにすると、読みやすくなります。
Pocketsand

26

多くの可能性があります。最も簡単な方法は、pgAdminを使用してSQLウィンドウから取得することです。しかし、あなたがexaminateプログラムでこれを取得したい場合pg_procpg_trigger、システムのカタログやroutinestriggers(それはすべての機能に特にPostgreSQLの特定をカバーしていない可能性があるのSQL標準的な方法ということが、)情報スキーマからの景色。例えば:

SELECT
    routine_definition 
FROM
    information_schema.routines 
WHERE
    specific_schema LIKE 'public'
    AND routine_name LIKE 'functionName';

3
うーん..私は空のroutine_defintionを持つPGPSQL関数を持っています、そして、routine_bodyフィールドで「EXTERNAL」と述べます。それらを見つけることができるヒントはありますか?
alfonx 2012年

2
+1これは、より標準的でポータブルなソリューションです。ビューの場合SQLは、次のとおりです。SELECT view_definition FROM information_schema.views WHERE table_schema = ? AND table_name = ?
Franta

しかし、誰かが同じ名前と異なる関数引数で関数を作成したために関数名が一意でない場合はどうでしょうか?stackoverflow.com/questions/47341513/...
mg1075

参照@alfonx pgproc.prosrcコラム
トマーシュZáluský

12

関数を表示するだけではなく、インプレース編集機能も利用できます。

\ef <function_name>とても便利です。関数のソースコードを編集可能な形式で開きます。表示できるだけでなく、編集して実行することもできます。

ただ、\efFUNCTION_NAMEなしFUNCTIONテンプレートを作成、編集可能なを開きます。

詳細なリファレンス-> https://www.postgresql.org/docs/9.6/static/app-psql.html


11

\sf psqlのfunction_nameは、単一の関数の編集可能なソースコードを生成します。

https://www.postgresql.org/docs/9.6/static/app-psql.htmlから:

\ sf [+] function_descriptionこのコマンドは、名前付き関数の定義をフェッチして、CREATE OR REPLACE FUNCTIONコマンドの形式で表示します。

コマンド名に+が追加されている場合、出力行には番号が付けられ、関数本体の最初の行は1行目です。


関数のソースコードを示します。\ ef関数名は編集可能なテンプレートでそれを開きます
アマー


0

バージョン以降:psql(9.6.17、サーバー11.6)

私は上記の答えをすべて試しましたが、私にとっては

postgres=> \sf jsonb_extract_path_text
CREATE OR REPLACE FUNCTION pg_catalog.jsonb_extract_path_text(from_json jsonb, VARIADIC path_elems text[])
 RETURNS text
 LANGUAGE internal
 IMMUTABLE PARALLEL SAFE STRICT
AS $function$jsonb_extract_path_text$function$



postgres=> \df+
ERROR:  column p.proisagg does not exist
LINE 6:   WHEN p.proisagg THEN 'agg'
               ^
HINT:  Perhaps you meant to reference the column "p.prolang".

dfがうまくいかないようです。

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