ค้นหาคำจำกัดความของมุมมองที่ปรากฏใน Postgres


21

ฉันสงสัยว่าจะค้นหาคำจำกัดความของมุมมองที่ปรากฏใน Postgres ได้อย่างไร สำหรับการอ้างอิงสิ่งที่ฉันหวังว่าจะทำนั้นคล้ายกับสิ่งที่คุณสามารถทำได้สำหรับมุมมองปกติ:

SELECT * FROM information_schema.views WHERE table_name = 'some_view';

ซึ่งให้คอลัมน์ต่อไปนี้แก่คุณ:

table_catalog
table_schema
table_name
view_definition
check_option
is_updatable
is_insertable_into
is_trigger_updatable
is_trigger_deletable
is_trigger_insertable_into

สิ่งนี้เป็นไปได้หรือไม่สำหรับมุมมองที่ปรากฏขึ้น

จากการวิจัยของฉันจนถึงขณะนี้ปรากฏว่ามุมมองที่เป็นรูปธรรมได้รับการยกเว้นโดยเจตนาจาก information_schema เพราะ

information_schema สามารถแสดงวัตถุที่มีอยู่ในมาตรฐาน SQL เท่านั้น

( http://www.postgresql.org/message-id/3794.1412980686@sss.pgh.pa.us )

เนื่องจากดูเหมือนว่าพวกเขาจะถูกแยกออกจาก information_schema ทั้งหมดฉันไม่แน่ใจว่าจะทำอย่างไร แต่สิ่งที่ฉันต้องการทำคือทวีคูณ:

  1. สอบถามว่ามีมุมมองที่ปรากฏขึ้นโดยเฉพาะหรือไม่ (จนถึงตอนนี้วิธีเดียวที่ฉันพบว่าทำคือลองสร้างมุมมอง mat ด้วยชื่อเดียวกันและดูว่ามันระเบิดขึ้นหรือไม่)
  2. จากนั้นสอบถามคำจำกัดความของมุมมองที่ปรากฏขึ้น (คล้ายกับview_definitionคอลัมน์บนinformation_schema.views)

คำถามที่เกี่ยวข้องกับการสอบถามข้อ จำกัด ที่ไม่ซ้ำกันเกี่ยวกับมุมมองที่ปรากฏ: dba.stackexchange.com/questions/101899
Sean the Bean

คุณจะสนใจวิธีที่รวดเร็วในการทดสอบการมีอยู่ของ: SELECT to_regclass('some_schema.some_mat_view')- หากพบว่ามันไม่จำเป็นต้องเป็น MV ละเอียด: stackoverflow.com/questions/20582500/…
Erwin Brandstetter

คำตอบ:



13

ปรากฎว่านี่ไม่ซับซ้อนอย่างที่ฉันคิด! (มีความรู้เพียงเล็กน้อยเกี่ยวกับ pg_catalog ... )

ส่วนที่ 1: สอบถามว่ามีมุมมองที่ปรากฏจริงหรือไม่:

SELECT count(*) > 0
FROM pg_catalog.pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind = 'm'
AND n.nspname = 'some_schema'
AND c.relname = 'some_mat_view';

ดีและง่าย

ส่วนที่ 2: ค้นหาคำจำกัดความของมุมมองที่ปรากฏ:

เพื่อที่จะได้คำค้นหาเพื่อให้ได้คำจำกัดความของมุมมอง mat ฉันต้องค้นหาคำจำกัดความของinformation_schema.viewsมุมมองโดยเรียกใช้:

SELECT view_definition
FROM information_schema.views
WHERE table_schema = 'information_schema'
AND table_name = 'views';

จากนั้นฉันก็คัดลอกเคียวรีออกและเปลี่ยนc.relkind = 'v'::"char"เป็นc.relkind = 'm'::"char"เพื่อรับมุมมอง mat (แทนที่จะเป็นมุมมองปกติ) ดูข้อความค้นหาทั้งหมดได้ที่นี่: http://pastebin.com/p60xwfes

ณ จุดนี้คุณสวยได้อย่างง่ายดายสามารถเพิ่มและใช้มันเพื่อให้ได้ความหมายของAND c.relname = 'some_mat_view'some_mat_view

แต่คุณยังคงต้องทำสิ่งนี้อีกครั้งในครั้งต่อไปที่คุณต้องการค้นหาคำจำกัดความของมุมมองแบบ mat ...

โบนัส: สร้างมุมมองเพื่อทำให้ง่ายขึ้น

ฉันเลือกที่จะสร้างมุมมองใหม่เพื่อให้ง่ายต่อการค้นหาคำจำกัดความมุมมองแบบ mat ในอนาคต โดยทั่วไปฉันเพิ่งเพิ่มCREATE VIEW materialized_views ASไปยังจุดเริ่มต้นของแบบสอบถามที่ลิงก์ด้านบนเพื่อสร้างมุมมองใหม่และตอนนี้ฉันสามารถสืบค้นได้เช่น:

SELECT *
FROM materialized_views
WHERE table_schema = 'some_schema'
AND table_name = 'some_mat_view';

ดีกว่ามาก!

ฉันยังสามารถใช้มุมมองนี้เพื่อให้ง่ายต่อการสืบค้นข้อมูลไม่ว่าจะเป็นดู materialized มีอยู่โดยการเปลี่ยนไป*count(*) > 0

คำเตือน : ฉันไม่รู้คอลัมน์อื่น ๆ ในผลการสืบค้นนั้นถูกต้องทั้งหมดเนื่องจากมุมมองที่เป็นรูปธรรมแตกต่างจากมุมมองมาตรฐาน (ฉันคิดว่ามันถูกต้อง) แต่นี้ไม่ที่แบบสอบถามน้อยtable_schema, table_nameและview_definitionอย่างถูกต้อง


0

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

ฉันไม่สามารถพูดได้ว่าฉันเข้าใจรูปแบบข้อมูลพื้นฐานทั้งหมดดังนั้นให้ใช้วิธีแก้ปัญหาด้านล่างด้วยเกลือเม็ดเล็ก ๆ :

select 
    ns.nspname as schema_name, 
    cls.relname as table_name, 
    attr.attname as column_name,
    trim(leading '_' from tp.typname) as datatype
from pg_catalog.pg_attribute as attr
join pg_catalog.pg_class as cls on cls.oid = attr.attrelid
join pg_catalog.pg_namespace as ns on ns.oid = cls.relnamespace
join pg_catalog.pg_type as tp on tp.typelem = attr.atttypid
where 
    ns.nspname = 'your_schema' and
    cls.relname = 'your_materialized_view' and 
    not attr.attisdropped and 
    cast(tp.typanalyze as text) = 'array_typanalyze' and 
    attr.attnum > 0
order by 
    attr.attnum

คุณมีการเปลี่ยนแปลงและ'your_schema''your_materialized_view'

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