2013-02-22 85 views
5

मैं अपने पोस्टग्रेज़ डेटाबेस को उसकेोकू पर साफ़ करने की कोशिश कर रहा हूं, जहां कुछ बड़ी वस्तुएं नियंत्रण से बाहर हो गई हैं और मैं बड़ी वस्तुओं को निकालना चाहता हूं जिनका अब उपयोग नहीं किया जाता है।heroku पर pg_largeobject पहुंच

मेरे देव मशीन पर, मैं कर सकते हैं:

select distinct loid from pg_largeobject 
Where loid Not In (select id from table) 

तो मैं चलाएँ:

SELECT lo_unlink(loid) 
उन आईडी में से प्रत्येक पर

लेकिन Heroku पर, मैं नहीं किसी भी चयन pg_largeobject पर चलाया जा सकता है के रूप में भी

select * from pg_largeobject limit 1; 

मुझे एक त्रुटि देता है:

ERROR: permission denied for relation pg_largeobject 

कोई सुझाव कैसे इस के आसपास भी काम करने के लिए, या वास्तव में क्यों हम heroku में pg_largeobject पर पढ़ने की पहुंच नहीं है?

+0

'\ dp + pg_catalog.pg_largeobject' क्या दिखाता है? –

+0

स्कीमा | नाम | टाइप करें एक्सेस विशेषाधिकार | कॉलम एक्सेस विशेषाधिकार ------------ + ---------------- + ------- + -------- ----------- + -------------------------- pg_catalog | pg_largeobject | टेबल | | – bvanklinken

+0

खेद नहीं है, लेकिन कोई पहुंच नहीं है – bvanklinken

उत्तर

8

PostgreSQL 9.0 के बाद, एक गैर-सुपरसुर pg_largeobject तक नहीं पहुंच सकता है। यह रिलीज नोट्स में दर्ज है:

Add the ability to control large object (BLOB) permissions with GRANT/REVOKE (KaiGai Kohei)

Formerly, any database user could read or modify any large object. Read and write permissions can now be granted and revoked per large object, and the ownership of large objects is tracked.

अगर यह आपकी विकास उदाहरण पर काम करता है, यह या तो यह संस्करण 8.4 या कम है, क्योंकि, या क्योंकि तुम एक सुपर उपयोगकर्ता के रूप में प्रवेश किया हो।

आप Heroku पर एक सुपर उपयोगकर्ता के रूप में प्रवेश नहीं कर सकते, मुझे लगता है कि आप pg_dump के साथ दूरदराज के डेटाबेस डंप कर सकता है, तो यह स्थानीय स्तर पर फिर से लोड, एक स्थानीय सुपर उपयोगकर्ता के रूप में लीक OIDs की पहचान, lo_unlink साथ एक स्क्रिप्ट में डाल आदेश, और अंत में इस स्क्रिप्ट को Heroku उदाहरण के खिलाफ खेलते हैं।

अद्यतन:

कैसे psql \dl आदेश डेटाबेस प्रश्नों के आधार पर, ऐसा लगता है कि pg_catalog.pg_largeobject_metadata इस क्वेरी के माध्यम से, OIDs और सभी बड़ी वस्तुओं के स्वामित्व को पुनः प्राप्त करने के लिए इस्तेमाल किया जा सकता है:

SELECT oid as "ID", 
    pg_catalog.pg_get_userbyid(lomowner) as "Owner", 
    pg_catalog.obj_description(oid, 'pg_largeobject') as "Description" 
    FROM pg_catalog.pg_largeobject_metadata ORDER BY oid 

select oid from pg_largeobject_metadata 
Where oid Not In (select id from table) 
:

तो अपने प्रारंभिक लीक बड़ी वस्तुओं खोजने क्वेरी में 9.0+ के साथ गैर superusers के लिए बदला जा सकता है

और यदि आवश्यक हो, तो lomowner पर एक शर्त को किसी विशिष्ट उपयोगकर्ता के स्वामित्व वाली बड़ी वस्तुओं पर फ़िल्टर करने के लिए जोड़ा जा सकता है।

+0

ठीक है, मैं देव में su हूँ। क्या मौजूदा उपयोगकर्ता के पास उपलब्ध बड़ी ऑब्जेक्ट आईडी सूचीबद्ध करने का कोई तरीका नहीं है? – bvanklinken

+0

@bvanklinken: ऐसा प्रतीत होता है, मैंने जवाब अपडेट किया है। –

+0

आह धन्यवाद। मैंने वास्तव में मेटाडेटा टेबल को देखा था। लेकिन प्रलेखन (http://www.postgresql.org/docs/9.0/static/catalog-pg-largeobject-metadata.html) और क्वेरी का चयन करें * pg_largeobject_metadata से एक ओड फ़ील्ड के बारे में कुछ भी सुझाव नहीं देता है - इसलिए मैं पूरी तरह से चूक गया उस। – bvanklinken