PostgreSQL: วิธีแสดงรายการฟังก์ชั่นที่เก็บไว้ทั้งหมดที่เข้าถึงตารางเฉพาะ


13

บทนำ:

ฐานข้อมูล PostgreSQL พร้อมฟังก์ชั่นการจัดเก็บหลายร้อยรายการรวมถึงล้าสมัยไม่ได้ใช้งาน ฯลฯ

ปัญหา

ฉันต้องการค้นหาฟังก์ชั่นที่เก็บไว้ทั้งหมดที่มีความสัมพันธ์กับตาราง X - เพราะฉันต้องการเปลี่ยนโครงสร้างตาราง บางคนอาจไม่ได้ใช้ดังนั้นฉันไม่สามารถทำได้เพียงแค่ดูรหัส

โซลูชันที่ฉันมี ATM กำลังใช้งาน psql \df+และ grepping output แต่ฉันต้องการโซลูชันที่คล้ายกับฐานข้อมูลมากขึ้นเช่นโดยใช้ schema ของข้อมูล นี่จะเป็นงานซ้ำ ๆ แน่นอนและฉันต้องการให้มันดีและสะอาด

ข้อเสนอแนะใด ๆ

คำตอบ:


18

ร่างกายของฟังก์ชั่นจะถูกเก็บไว้เช่นเดียวกับสตริง ไม่มีรายการของวัตถุที่อ้างอิง (ซึ่งแตกต่างจากมุมมองเช่นที่บันทึกลิงก์จริงไปยังตารางอ้างอิง)

เคียวรีสำหรับPostgres 10 หรือเก่ากว่านี้ใช้ฟังก์ชันข้อมูลระบบแค็ตตาล็อกpg_get_functiondef()เพื่อสร้างCREATE FUNCTIONสคริปต์ใหม่สำหรับฟังก์ชันที่เกี่ยวข้องและค้นหาชื่อตารางด้วยนิพจน์ทั่วไป

SELECT n.nspname AS schema_name
     , p.proname AS function_name
     , pg_get_function_arguments(p.oid) AS args
     , pg_get_functiondef(p.oid) AS func_def
FROM   pg_proc p
JOIN   pg_namespace n ON n.oid = p.pronamespace
WHERE  NOT p.proisagg
AND    n.nspname NOT LIKE 'pg_%'
AND    n.nspname <> 'information_schema'
AND    pg_get_functiondef(p.oid) ~* '\mbig\M';

มันควรจะทำงาน แต่เห็นได้ชัดว่ามันไม่ได้พิสูจน์กระสุน สามารถล้มเหลวสำหรับ SQL แบบไดนามิกที่ชื่อตารางถูกสร้างแบบไดนามิกและสามารถส่งกลับจำนวนบวกเท็จใด ๆ - โดยเฉพาะถ้าชื่อตารางเป็นคำทั่วไป

ฟังก์ชั่นรวมและฟังก์ชั่นทั้งหมดจากสคีมาของระบบจะไม่รวม

\mและ\Mทำเครื่องหมายจุดเริ่มต้นและจุดสิ้นสุดของคำในนิพจน์ปกติ

แคตตาล็อกระบบที่pg_procเปลี่ยนแปลงใน Postgres 11 proisaggถูกแทนที่ด้วยprokindมีการเพิ่มกระบวนงานที่เก็บจริง คุณต้องปรับตัว ที่เกี่ยวข้อง:


1
ใช่ ... มันไม่สมบูรณ์โดยสิ้นเชิงในแง่ที่ว่ามันจะไม่พบEXECUTEการแสดงออกเช่น'mm_'||name_parameterนั้นและมันจะไม่รับมืออย่างถูกต้องกับชื่อที่ยกมาเช่น"my""table""หรือแบบตัวพิมพ์เล็ก แต่มันจะทำในสิ่งที่คนส่วนใหญ่ต้องการ .
Craig Ringer

@CraigRinger: ใช่แบบสอบถามแบบไดนามิกที่EXECUTEมีเกือบเป็นไปไม่ได้ที่จะครอบคลุม แต่ตัวพิมพ์เล็กสามารถครอบคลุมด้วย~*แทนที่จะเป็น~- หรือการจับคู่รูปแบบตัวพิมพ์เล็กและตัวพิมพ์เล็กอื่น ๆ
Erwin Brandstetter

ตราบใดที่โอเปอเรเตอร์ยังไม่บ้าพอที่จะสร้างชื่อตาราง"MyTable"และMyTableอย่างน้อยก็ ... และโดยสุจริตนั่นคือ "ดีนั่นอาจได้รับอนุญาต แต่มันไม่ฉลาด"
Craig Ringer

ขอบคุณสำหรับคำตอบ! ที่จริงฉันไม่ได้ใช้การสร้างชื่อตารางแบบไดนามิกที่ใดก็ได้และชื่อตารางทั้งหมดเป็นตัวพิมพ์เล็ก
Sergey Kudriavtsev

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.