มีวิธีเข้าถึงตารางชั่วคราวของเซสชันอื่น ๆ ใน postgres หรือไม่?


17

ฉันทำงานกับแอพพลิเคชั่น Windows ที่ใช้ฐานข้อมูล postgres (ในพื้นที่) และเก็บข้อมูลบางอย่างไว้ในตารางชั่วคราว ฉันต้องการดูตารางชั่วคราว แต่ pgadmin และ dbVis บอกฉัน: ERROR: cannot access temporary tables of other sessionsเมื่อพยายามสืบค้นข้อมูล ฉันพยายามเปลี่ยนการอนุญาตของ schema และตาราง แต่ดูเหมือนจะไม่ช่วยแม้ว่าฉันจะเข้าถึงฐานข้อมูลกับผู้ใช้เดียวกันกับโปรแกรมตัวเอง (อย่างน้อยใน dbVis) มีการตั้งค่าที่ฉันสามารถเปลี่ยนในฐานข้อมูลของฉันที่อนุญาตให้ฉันเข้าถึง "รูท" ทุกเซสชันในฐานข้อมูลของฉันได้หรือไม่?

คำตอบ:


14

การขาดการเข้าถึงตารางชั่วคราวในเซสชันอื่นไม่ใช่เรื่องของสิทธิ์ แต่เป็นข้อ จำกัด ทางเทคนิคของการออกแบบ แบ็กเอนด์ PostgreSQL ไม่สามารถเข้าถึงตารางชั่วคราวของแบ็กเอนด์อื่นเนื่องจากไม่มีการดูแลตามปกติที่อนุญาตให้เข้าถึงแบบพร้อมกันสำหรับตารางชั่วคราว

ใน 9.2 คุณจะต้องการใช้UNLOGGEDตารางแทน สิ่งนี้สามารถมองเห็นได้จากเซสชันอื่น แต่ยังคงรักษาประสิทธิภาพการทำงานส่วนใหญ่ของตารางชั่วคราวไว้


11

คำตอบสั้น ๆ คือ "ไม่" ตารางชั่วคราวในเซสชันอื่นไม่สามารถมองเห็นได้ด้วยการออกแบบ มันไม่ต่างอะไรเลยถ้าสองเซสชันมีผู้ใช้คนเดียวกัน แม้:

autovacuum daemon ไม่สามารถเข้าถึงได้ดังนั้นจึงไม่สามารถดูดหรือวิเคราะห์ตารางชั่วคราวได้


เมื่อตาราง temp ตกจำเป็นต้องมีเครื่องดูดฝุ่นเพื่อซับหน่วยความจำหรือทรัพยากรดิสก์ใด ๆ หรือไม่ ฉันกำลังพยายามแก้ไขปัญหานี้และไม่แน่ใจว่าข้อเท็จจริงนี้ที่ autovacuum ไม่สามารถมองเห็นตาราง temp เป็นสาเหตุของการรั่วไหลของหน่วยความจำ ฉันต้องดูดฝุ่นด้วยตนเองหรือไม่
poshest

"เมื่อ temp ตารางจะลดลงไม่พวกเขาต้องสูญญากาศ" ไม่ดูที่นี่ เช่นเดียวกันสำหรับทุกโต๊ะไม่ใช่แค่เทมเพลตตาราง
แจ็คดักลาส

3

ฉันไม่รู้ว่าสิ่งนี้จะช่วยคุณได้หรือไม่ แต่คุณสามารถลองได้

ต่อไปนี้แบบสอบถามตารางระบบแคตตาล็อกควรจะสามารถแสดงรายการตารางชั่วคราวทั้งหมดที่สร้างขึ้นในช่วงอื่น ๆ ในฐานข้อมูล:

เลือก pn.nspname, pc.relname จาก pg_class pc, pg_namespace pn โดยที่ pc.relnamespace = pn.oid และ pc.relname ilike 'your_temp_table_name';

ต่อ PostgreSQL doc , และมักจะสร้างขึ้นที่มีชื่อเป็นTemporary tables exist in a special schema ดังนั้นการใช้pg_temp_xxx จากแบบสอบถามด้านบนคุณควรสืบค้นตารางชั่วคราวของคุณ อย่างที่คุณเห็นที่นี่ตารางชั่วคราวถูกอ้างอิงด้วยชื่อที่ผ่านการรับรองด้วยสคีมาschemanamerelationname

ตัวอย่าง: select * from pg_temp_20.your_temp_table_name


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