จะพิมพ์ฟังก์ชันและทริกเกอร์ซอร์สโค้ดใน postgresql ได้อย่างไร กรุณาแจ้งให้เราทราบหากมีคนรู้ว่าแบบสอบถามเพื่อแสดงฟังก์ชั่นทริกเกอร์ซอร์สโค้ด
จะพิมพ์ฟังก์ชันและทริกเกอร์ซอร์สโค้ดใน postgresql ได้อย่างไร กรุณาแจ้งให้เราทราบหากมีคนรู้ว่าแบบสอบถามเพื่อแสดงฟังก์ชั่นทริกเกอร์ซอร์สโค้ด
คำตอบ:
\df+
ในpsqlให้รหัสต้นฉบับแก่คุณ
\df
เพื่อค้นหาชื่อของฟังก์ชั่นของคุณแล้ว\x
สำหรับการส่งออกขยายแล้ว\df+ name_of_function
\df ltxtquery
แต่มีการตอบสนองที่ไม่มี
\x ON
เป็นสิ่งจำเป็นสำหรับการแสดงที่ถูกย้าย
สำหรับฟังก์ชั่น:
คุณสามารถสอบถามมุมมอง 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
มันจะแสดงซอร์สโค้ดของฟังก์ชั่น
สำหรับทริกเกอร์:
ฉันไม่รู้ว่ามีวิธีการโดยตรงในการรับซอร์สโค้ดหรือไม่ เพิ่งรู้วิธีต่อไปนี้อาจช่วยคุณได้!
skytf => เลือก tgrelid จาก pg_trigger โดยที่ tgname = 'insert_tbl_tmp_trigger'; tgrelid --------- 26599 (1 แถว)
skytf => เลือก oid, relname จาก pg_class โดยที่ oid = 26599; oid | relname ------- + ----------------------------- 26599 | tbl_tmp (1 แถว)
skytf => \ d tbl_tmp
มันจะแสดงรายละเอียดของทริกเกอร์ของตาราง โดยปกติทริกเกอร์จะใช้ฟังก์ชั่น ดังนั้นคุณสามารถรับซอร์สโค้ดของฟังก์ชันทริกเกอร์ได้ตามที่กล่าวไว้ข้างต้น!
นี่คือตัวอย่างเล็ก ๆ น้อย ๆ จาก PostgreSQL-9.5
รายการแสดงผล:
\df+
\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$
\x
ครั้งแรกเพื่อเปิดการแสดงผลแบบขยายยังช่วยให้สามารถอ่านได้
มีความเป็นไปได้มากมาย วิธีที่ง่ายที่สุดคือใช้ 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';
SELECT view_definition FROM information_schema.views WHERE table_schema = ? AND table_name = ?
pgproc.prosrc
คอลัมน์
มากกว่าเพียงแค่แสดงฟังก์ชั่นเพียงเล็กน้อยวิธีการเกี่ยวกับการแก้ไขสิ่งอำนวยความสะดวกในสถานที่เช่นกัน
\ef <function_name>
มีประโยชน์มาก มันจะเปิดซอร์สโค้ดของฟังก์ชั่นในรูปแบบที่สามารถแก้ไขได้ คุณจะไม่สามารถดูได้เท่านั้นคุณสามารถแก้ไขและดำเนินการได้เช่นกัน
เพียงแค่\ef
ไม่มี function_name จะเปิดเทมเพลต CREATE FUNCTION ที่แก้ไขได้
สำหรับการอ้างอิงเพิ่มเติม -> https://www.postgresql.org/docs/9.6/static/app-psql.html
\sf
function_name ใน psql ให้ผลตอบแทนรหัสที่แก้ไขได้ของฟังก์ชั่นเดียว
จากhttps://www.postgresql.org/docs/9.6/static/app-psql.html :
\ sf [+] function_description คำสั่งนี้ดึงข้อมูลและแสดงคำจำกัดความของฟังก์ชั่นที่มีชื่อในรูปแบบของคำสั่ง CREATE หรือ REPLACE FUNCTION
หาก + ผนวกเข้ากับชื่อคำสั่งดังนั้นบรรทัดเอาต์พุตจะถูกกำหนดหมายเลขโดยที่บรรทัดแรกของร่างกายฟังก์ชันคือบรรทัด 1
นอกจากนี้สำหรับคำตอบของ @ 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 ) ที่ได้รับจาก)
ตั้งแต่เวอร์ชั่น: 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 ดูเหมือนจะไม่ทำงานสำหรับฉัน
select * from pg_trigger;
หรือถ้าคุณต้องการดูว่าแต่ละตารางทริกเกอร์ใดที่ใช้กับselect tgrelid::regclass, tgname from pg_trigger;
FWIW `