วิธีแสดงรายการมุมมองทั้งหมดใน SQL ใน PostgreSQL


40

ฉันจะแสดงรายการมุมมองทั้งหมดสำหรับฐานข้อมูลโดยใช้คำสั่ง SQL ใน PostgreSQL ได้อย่างไร

ฉันต้องการบางสิ่งที่คล้ายกับเอาต์พุตของ\dvคำสั่งpsql แต่ควรเป็นเพียงแค่รายการของชื่อมุมมอง เช่น,

SELECT ...;
my_view_1
my_view_2
my_view_3

ฉันใช้ PostgreSQL v9.1.4 บน Ubuntu Linux


คุณสามารถเลือกคำตอบได้ไหม?
Evan Carroll

คำตอบ:


42

จากเอกสาร :

 select table_name from INFORMATION_SCHEMA.views;

หากคุณไม่ต้องการให้มุมมองระบบเป็นผลลัพธ์ของคุณให้ลองสิ่งนี้:

 select table_name from INFORMATION_SCHEMA.views WHERE table_schema = ANY (current_schemas(false))

ขอบคุณ @Phil อย่างไรก็ตามคำสั่งนั้นส่งคืน 128 แถวในขณะที่ \ dv ส่งคืน 57 แถว ดูเหมือนว่าจะให้มุมมองระบบกับฉันเช่น "tables", "columns", "domains", "pg_role" ฯลฯ ฉันจะดูเฉพาะมุมมองที่ฉันสร้างได้อย่างไร
Rob Bednark

มันจะให้รายการของสิ่งที่คุณสามารถเข้าถึงได้ ในการรับค่าสคีมาให้เพิ่มลงwhere table_schema='USERNAME'ใน
คิวรี

@phil ใช้งานได้ก็ต่อเมื่อมีสคีมาที่มีชื่อเหมือนกันกับผู้ใช้ โดยค่าเริ่มต้นนี่ไม่ใช่กรณีอย่างไรก็ตามมีpublicschema
dezso

1
INFORMATION_SCHEMA.views จะแสดงมุมมองที่ผู้ใช้ปัจจุบันมีสิทธิ์ หากมีมุมมองในฐานข้อมูลที่ผู้ใช้ปัจจุบันไม่มีสิทธิ์เปิดอยู่ชื่อของมุมมองเหล่านั้นจะไม่ปรากฏในผลลัพธ์ จากเอกสารในลิงค์ของ @ Phil: เฉพาะมุมมองที่แสดงให้เห็นว่าผู้ใช้ปัจจุบันมีสิทธิ์เข้าถึง (โดยการเป็นเจ้าของหรือมีสิทธิ์)
Cao Minh Tu

21

คุณสามารถสอบถามข้อมูลที่pg_catalog.pg_viewsคุณต้องการได้:

select viewname from pg_catalog.pg_views;

คิวรีที่ได้รับการปรับปรุงเพื่อรับชื่อสกีมาด้วยเช่นกันในกรณีที่คุณมีหลายมุมมองพร้อมชื่อเดียวกันในสกีมาที่แตกต่างกันและออกจากมุมมองระบบเหล่านั้น:

select schemaname, viewname from pg_catalog.pg_views
where schemaname NOT IN ('pg_catalog', 'information_schema')
order by schemaname, viewname;

IMHO วิธีนี้จะดีกว่า INFORMATION_SCHEMA.views แบบสอบถามสำหรับเหตุผลที่ระบุไว้ในของฉันความคิดเห็นเพื่อคำตอบของฟิล


4

หากคุณต้องการเพียงสิ่งนี้แบบโต้ตอบในขณะที่อยู่ในpsqlคุณยังสามารถใช้\dvเพื่อแสดงมุมมองหรือ\dmสำหรับมุมมองที่ปรากฏ หรือใช้กับ+เหมือน\dm+เช่นการแสดงข้อมูลเพิ่มเติมบางอย่าง (มีประโยชน์ส่วนใหญ่เพื่อดูขนาดดู materialized)


1
\dv *.*และ\dm *.* สำหรับข้อมูลเหล่านั้นใน schemas ทั้งหมด!
Pak

3

ลอง:

SELECT  n.nspname AS table_schema,
        pg_catalog.pg_get_userbyid(c.relowner) AS table_owner,
        c.relname AS table_name
    FROM pg_catalog.pg_class c
         LEFT JOIN pg_catalog.pg_namespace n ON (n.oid = c.relnamespace)
    WHERE c.relkind  = 'v'
;

หากคุณต้องการรายละเอียดเพิ่มเติมคุณสามารถแก้ไขสิ่งต่อไปนี้เพื่อให้เหมาะกับความต้องการของคุณ:

SELECT  n.nspname AS table_schema,
        pg_catalog.pg_get_userbyid(c.relowner) AS table_owner,
        c.relname AS table_name,
        s.n_live_tup AS row_count,
        count (a.attname) AS column_count,
        pg_catalog.obj_description(c.oid, 'pg_class') AS comments,
        CASE c.relkind
            WHEN 'v'
            THEN pg_catalog.pg_get_viewdef(c.oid, true)
            ELSE null
            END AS query
    FROM pg_catalog.pg_class c
         LEFT JOIN pg_catalog.pg_namespace n ON (n.oid = c.relnamespace)
         LEFT JOIN pg_catalog.pg_attribute a ON (c.oid = a.attrelid AND a.attnum > 0 AND NOT a.attisdropped)
         LEFT JOIN pg_catalog.pg_stat_all_tables s ON (c.oid = s.relid)
    WHERE c.relkind  = 'v'
GROUP BY n.nspname,
        c.relowner,
        c.relkind,
        c.relname,
        s.n_live_tup,
        c.oid
ORDER BY n.nspname,
        c.relname
;

2

ฉันสร้าง a viewเพื่อแสดงแคตตาล็อกของviews:

create or replace view show_views as 
select table_name from INFORMATION_SCHEMA.views 
WHERE table_schema = ANY (current_schemas(false));

และเมื่อฉันต้องการที่จะเห็นมุมมองทั้งหมดในฐานข้อมูลที่ฉันเขียน:

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