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; 

또 다른 방법은 바로 commont을 실행할 수 있다는 것입니다 \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 단계 : 트리거가없는 테이블을 가져옵니다.
    skytf => pg_trigger에서 tgrelid를 선택하십시오. 여기서 tgname = 'insert_tbl_tmp_trigger';
      트 그리드
    ---------
       26599
    (1 행)
  • 2 단계 : 위의 OID의 테이블 이름을 가져옵니다!
    skytf => pg_class에서 oid, relname을 선택하십시오. oid = 26599;
      oid | 성명           
    ------- + -----------------------------
     26599 | tbl_tmp
    (1 행)
  • 3 단계 : 테이블 정보 나열
    skytf => \ d tbl_tmp

테이블 트리거의 세부 사항이 표시됩니다. 일반적으로 트리거는 기능을 사용합니다. 따라서 위에서 지적한 것처럼 트리거 함수의 소스 코드를 얻을 수 있습니다!


37

다음은 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
사용하여 \x확장 된 디스플레이를 켭 첫째도 가독성에 도움이됩니다.
포켓 및

26

많은 가능성이 있습니다. 가장 간단한 방법은 pgAdmin을 사용하여 SQL 창에서 가져 오는 것입니다. 당신이 examinate 프로그래밍 다음이 얻을하려는 경우 pg_procpg_trigger시스템 카탈로그 나 routinestriggers정보 스키마 뷰 (의 표준 방법을 SQL 것을,하지만 모든 특히 PostgreSQL의 특정 기능을 포함하지 않을 수 있습니다). 예를 들면 다음과 같습니다.

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

3
음 .. 빈 루틴 _ 정의가있는 PGPSQL 함수를 가지고 있으며 루틴 _body 필드에 'EXTERNAL'상태가 있습니다. 내가 찾을 수있는 힌트가 있습니까?
alfonx

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열 참조
Tomáš Záluský

12

단순히 기능을 표시하는 것 이상으로, 내부 편집 기능을 얻는 방법도 있습니다.

\ef <function_name>매우 편리합니다. 함수의 소스 코드를 편집 가능한 형식으로 엽니 다. 당신은 그것을 볼 수있을뿐만 아니라 편집하고 실행할 수도 있습니다.

그냥 \efFUNCTION_NAME없이 편집 기능 템플릿을 만들 열립니다.

추가 참조-> 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 함수 이름은 편집 가능한 templet에서 열립니다
amar


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.