วิธีการแสดงฟังก์ชั่นขั้นตอนทริกเกอร์ซอร์สโค้ดใน 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; 

อีกวิธีหนึ่งคือเพียงแค่เรียกใช้งานคำสั่ง\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 => เลือก tgrelid จาก pg_trigger โดยที่ tgname = 'insert_tbl_tmp_trigger';
      tgrelid
    ---------
       26599
    (1 แถว)
  • ขั้นตอนที่ 2: รับชื่อตารางของน้ำมันข้างต้น!
    skytf => เลือก oid, relname จาก pg_class โดยที่ oid = 26599;
      oid | relname           
    ------- + -----------------------------
     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ครั้งแรกเพื่อเปิดการแสดงผลแบบขยายยังช่วยให้สามารถอ่านได้
Pocketsand

26

มีความเป็นไปได้มากมาย วิธีที่ง่ายที่สุดคือใช้ pgAdmin และรับจากหน้าต่าง SQL อย่างไรก็ตามถ้าคุณต้องการได้รับทางโปรแกรมจากนั้นตรวจสอบpg_procและpg_triggerแคตตาล็อกระบบหรือroutinesและtriggersมุมมองจาก schema ของข้อมูล (นั่นเป็นวิธีมาตรฐานของ SQL แต่อาจไม่ครอบคลุมคุณลักษณะทั้งหมดโดยเฉพาะ PostgreSQL เฉพาะ) ตัวอย่างเช่น:

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

3
อืมมมมมฉันมีฟังก์ชั่น PGPSQL ที่มีรูทีนที่ว่างเปล่ากำหนดและระบุ 'ภายนอก' ในฟิลด์ rout_body คำใบ้ใดที่ฉันสามารถหาได้?
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>มีประโยชน์มาก มันจะเปิดซอร์สโค้ดของฟังก์ชั่นในรูปแบบที่สามารถแก้ไขได้ คุณจะไม่สามารถดูได้เท่านั้นคุณสามารถแก้ไขและดำเนินการได้เช่นกัน

เพียงแค่\efไม่มี function_name จะเปิดเทมเพลต CREATE FUNCTION ที่แก้ไขได้

สำหรับการอ้างอิงเพิ่มเติม -> https://www.postgresql.org/docs/9.6/static/app-psql.html


11

\sf function_name ใน psql ให้ผลตอบแทนรหัสที่แก้ไขได้ของฟังก์ชั่นเดียว

จากhttps://www.postgresql.org/docs/9.6/static/app-psql.html :

\ sf [+] function_description คำสั่งนี้ดึงข้อมูลและแสดงคำจำกัดความของฟังก์ชั่นที่มีชื่อในรูปแบบของคำสั่ง CREATE หรือ REPLACE FUNCTION

หาก + ผนวกเข้ากับชื่อคำสั่งดังนั้นบรรทัดเอาต์พุตจะถูกกำหนดหมายเลขโดยที่บรรทัดแรกของร่างกายฟังก์ชันคือบรรทัด 1


แสดงซอร์สโค้ดของฟังก์ชั่น \ ef ชื่อฟังก์ชั่นเปิดใน
amar

9

นอกจากนี้สำหรับคำตอบของ @ franc คุณสามารถใช้สิ่งนี้จากอินเตอร์เฟส SQL:

select 
    prosrc
from pg_trigger, pg_proc
where
 pg_proc.oid=pg_trigger.tgfoid
 and pg_trigger.tgname like '<name>'

(นำมาจากที่นี่: http://www.postgresql.org/message-id/Pine.BSF.4.10.10009140858080808080808080808080808080808080808080808080808080.80/80/80/80/80 ) ที่ได้รับจาก)


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.