मैं पोस्टग्रेज डेटाबेस से अन्य सभी उपयोगकर्ताओं को कैसे अलग कर सकता हूं?


13

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

यह इकाई परीक्षण के लिए है, और परीक्षण केवल मैन्युअल रूप से चलाए जाते हैं, इसलिए इसमें कोई खतरा नहीं है। केवल पुराने डेड कनेक्शन ही प्रभावित होंगे।

इन यूनीटेस्ट डेटाबेस से जुड़ने वाले कोई अन्य उपयोगकर्ता नहीं हैं।

पुराने मृत कनेक्शन विकासशील से आते हैं। यह हर समय होता है जब एक परीक्षण जो लिखा जा रहा है या विफल रहता है, वह साफ नहीं निकलता है।


यदि किसी को उत्पादन परिदृश्य में डिस्कनेक्ट करने के बाद भी कुछ समय के लिए अन्य उपयोगकर्ताओं को बंद रखना पड़ता है, तो नीचे दिए गए स्कॉट मारलो का जवाब देखें: /dba//a/6184/2024


डीबीए पर भी इसी तरह का प्रश्न देखें: सर्वर को बंद किए बिना किसी विशिष्ट डेटाबेस के सभी कनेक्शन कैसे छोड़ें?

जवाबों:


14

आप डेटाबेस को उपयोगकर्ता के रूप में कनेक्ट करने और चलाने के लिए प्रयास कर सकते हैं:

SELECT pg_terminate_backend( procpid )
FROM pg_stat_activity
WHERE procpid <> pg_backend_pid( )    -- 1. don't terminate your own session
    AND datname =                     -- 2. don't terminate connections to 
    (SELECT datname                   --    other databases in the cluster
       FROM pg_stat_activity
      WHERE procpid = pg_backend_pid( )
    );

अद्यतन एक बेहतर क्वेरी सबसेलेक्ट से छुटकारा पाती है:

SELECT pg_terminate_backend( procpid )
FROM pg_stat_activity
WHERE procpid <> pg_backend_pid( )
    AND datname = current_database( );

2
कनेक्ट की अनुमतियों को पुनः प्राप्त करने के लिए मत भूलना, अन्यथा आपके पास अनन्य पहुँच से पहले उपयोगकर्ता नए कनेक्शन बनाते हैं।
फ्रैंक हाइकेन

@ फ्रेंक हेइकेंस - अच्छा कैच। मैंने "मैनुअल यूनिट टेस्ट" पर कुंजी लगाई थी, लेकिन अगर यूनिट टेस्ट करने वाले व्यक्ति के अलावा अन्य लोग कनेक्ट हो रहे हैं, तो "से कनेक्ट करें" <datname> पर ... "आवश्यक होगा।"
20

1
PostgreSQL 9.2 में, procpidइसका नाम बदल दिया गया था pid, इसलिए उसके लिए देखें।
क्रेग रिंगर

प्रश्न में उपयोगकर्ता के साथ एक REVOKE करने से परे, मुझे भी REVOKE ..... सार्वजनिक - कुछ देखना था!
डेविड एन। वेल्टन

9.3 पर ऐसा लगता है कि pg_stat_activity.procpid को अब pg_stat_activity.pid कहा जाता है । ए-ओके अन्यथा काम किया।
JL Peyret

4

यहाँ समस्या दो गुना है, पहले आपको उन उपयोगकर्ताओं को डिस्कनेक्ट करने की आवश्यकता है, और दूसरा आपको उन्हें अपने सर्वर से बाहर रखने की आवश्यकता है। कनेक्ट परमिट को रद्द करने के बजाय, मैं आमतौर पर कुछ मशीनों और / या उपयोगकर्ताओं से नए कनेक्ट को मना करने के लिए pg_hba.conf का उपयोग करता हूं, फिर बस एक pg_ctl -m फास्ट स्टॉप करता हूं; pg_ctl सभी अन्य कनेक्शनों को छोड़ना शुरू कर देता है। डीडीएल परिवर्तन के साथ यह बहुत जरूरी है या आप सभी जगह गतिरोध प्राप्त करेंगे।


6
मैं हमेशा एक ही भूमिका का उपयोग करता हूं जो CONNECT को अनुमति देता है और अन्य सभी भूमिकाओं से विरासत में मिला है। इस एकल भूमिका के लिए REVOKE कनेक्ट करें और आपका काम हो गया। इसे pg_terminate_backend () के साथ एक फ़ंक्शन में लपेटें और जब आप सभी वर्तमान कनेक्शनों को रोकना चाहते हैं, तो आप नियंत्रण में हैं।
फ्रैंक हाइकेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.