Postgresql में स्रोत कोड को फ़ंक्शन, प्रक्रिया, ट्रिगर कैसे प्रदर्शित करें?


168

Postgresql में फ़ंक्शंस और ट्रिगर्स सोर्सकोड कैसे प्रिंट करें? कृपया मुझे बताएं कि क्या किसी को फ़ंक्शन को प्रदर्शित करने के लिए क्वेरी पता है, स्रोत कोड को ट्रिगर करता है।


11
अनुयायियों के लिए एक नोट के रूप में, जो यह पता लगाने की कोशिश कर रहे हैं कि सभी ट्रिगर को कैसे सूचीबद्ध किया जाए, यह select * from pg_trigger;या, यदि आप यह भी देखना चाहते हैं कि प्रत्येक ट्रिगर select tgrelid::regclass, tgname from pg_trigger;FWIW पर किस तालिका में लागू होता है
rogerdpack

जवाबों:


152

\df+में psql आप sourcecode देता है।


17
एक अच्छा :) मैं सुझाव देता हूं कि आप \dfअपने फ़ंक्शन का नाम, फिर \xविस्तारित आउटपुट के लिए उपयोग कर सकते हैं,\df+ name_of_function
सैम वाटकिंस

33
\ df + कोड की तुलना में बहुत अधिक आउटपुट करता है। यदि आप चाहते हैं कि सभी कोड है, \ sf चाल करेंगे!
Telic

स्थापित एक्स्टेंशन के कार्यों को कैसे देखें ? उदाहरण मैं ltree का उपयोग कर रहा हूं , लेकिन इसके साथ कोई प्रतिक्रिया नहीं है \df ltxtquery
पीटर क्रूस

\x ONट्रांसपोज़्ड डिस्प्ले के लिए जरूरी है
औरलैब्स

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: ट्रिगर की तालिका ओआईडी प्राप्त करें:
    skytf => pg_trigger से tgrelid चुनें जहाँ tgname = 'insert_tbl_tmp_trigger';
      tgrelid
    ---------
       26,599
    (1 पंक्ति)
  • चरण 2: उपरोक्त ओड की तालिका का नाम प्राप्त करें!
    skytf => oid चुनें, pg_class से relname जहां 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विस्तारित प्रदर्शन को चालू करने के लिए पहले उपयोग करना भी पठनीयता के साथ मदद करता है।
पॉकेटसैंड

26

बहुत संभावनाएं हैं। सबसे आसान तरीका है कि आप बस pgAdmin का उपयोग करें और इसे SQL विंडो से प्राप्त करें। हालांकि आप प्रोग्राम तो examinate इस प्राप्त करना चाहते हैं, तो pg_procऔर pg_triggerप्रणाली कैटलॉग या routinesऔर triggersजानकारी स्कीमा से दृश्य (के मानक तरीका SQL कि, लेकिन यह सब सुविधाओं विशेष रूप से PostgreSQL विशेष कवर नहीं हो सकता है)। उदाहरण के लिए:

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

3
Mmmm .. मेरे पास PGPSQL फ़ंक्शंस हैं, जिनके पास खाली दिनचर्या_डिफिनियन है, और क्षेत्र में नियमित रूप से 'EXTERNAL' की स्थिति है। कोई संकेत जहां मैं उन पा सकते हैं?
अल्फोंक्स

2
+1 यह अधिक मानक / पोर्टेबल समाधान है। विचारों के लिए एसक्यूएल है:SELECT view_definition FROM information_schema.views WHERE table_schema = ? AND table_name = ?
फ्रांता

लेकिन उस मामले के बारे में क्या है जहां एक फ़ंक्शन नाम अद्वितीय नहीं है क्योंकि किसी ने एक ही नाम और विभिन्न फ़ंक्शन तर्क के साथ फ़ंक्शन किए हैं? stackoverflow.com/questions/47341513/…
mg1075

@alfonx pgproc.prosrcस्तंभ देखें
Tomáš Záluský

12

फंक्शन को प्रदर्शित करने की तुलना में थोड़ा अधिक, एड-इन सुविधा के रूप में अच्छी तरह से कैसे प्राप्त करें।

\ef <function_name>बहुत काम है। यह संपादन योग्य प्रारूप में फ़ंक्शन का स्रोत कोड खोलेगा। आप न केवल इसे देख पाएंगे, आप इसे संपादित और निष्पादित भी कर सकते हैं।

केवल \ef function_name के बिना संपादन योग्य खुल जाएगा टेम्पलेट टेम्पलेट।

अधिक संदर्भ के लिए -> 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 यह आदेश एक क्रिएट या रिपलेंश फंक्शन कमांड के रूप में नामांकित फ़ंक्शन की परिभाषा को दिखाता है और दिखाता है।

यदि + को कमांड नाम से जोड़ा जाता है, तो आउटपुट लाइनों को क्रमबद्ध किया जाता है, जिसमें फ़ंक्शन बॉडी की पहली पंक्ति लाइन 1 होती है।


किसी फ़ंक्शन का स्रोत कोड दिखाता है। \ ef फ़ंक्शन का नाम इसे संपादन योग्य मंदिर में खोलता है
amar

9

इसके अतिरिक्त @ फ्रैंक के जवाब में आप इसे 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.10009140858080.28013-100000@megazone23.bigpanda.com )


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".

डीएफ मेरे लिए काम नहीं कर रहा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.