मेरे पिछले ब्लॉग में, हमने PostgreSQL 13 में पार्टिशन टेबल के साथ लॉजिकल प्रतिकृति की नई क्षमताओं का पता लगाया था। यह कहने की जरूरत नहीं है कि उल्लिखित रिलीज में ऐसी कई विशेषताएं हैं जो जल्द ही डीबीए और एप्लिकेशन के अनुभव को बढ़ाएगी। डेवलपर्स एक जैसे।
PostgreSQL 13 को देखते हुए, मैंने एक प्रविष्टि देखी जिसने मेरा ध्यान खींचा:
PostgreSQL 13 एक "विश्वसनीय एक्सटेंशन" की अवधारणा का परिचय देता है, जो एक सुपरयूज़र को एक्सटेंशन निर्दिष्ट करने की अनुमति देता है जिसे उपयोगकर्ता अपने डेटाबेस में तब तक स्थापित कर सकता है जब तक उनके पास क्रिएट विशेषाधिकार है।
आइए रिवाइंड करें
हम जानते हैं कि पोस्टग्रेएसक्यूएल के पास इसके मूल भाग को परेशान किए बिना अपनी टोपी में पंख जोड़ने की विस्तार शक्ति है। दूसरे शब्दों में, एक्सटेंशन गैर-दखल देने वाले तरीके से PostgreSQL सर्वर की कार्यात्मक क्षमताओं को बढ़ाते हैं।
वास्तव में, कई तृतीय पक्ष संगठन हैं जिन्होंने अद्भुत फीचर सेट उत्पन्न करने के लिए एक्सटेंशन तंत्र का उपयोग किया है। TimescaleDB एक ऐसा एक्सटेंशन है जहां यह IOT वर्कलोड के लिए इसे और अधिक उपयुक्त बनाने के लिए PostgreSQL सर्वर के व्यक्तित्व को बदल रहा है।
आइए एक नज़र डालते हैं कि PostgreSQL 13 से पहले क्या था और यह वास्तविक दर्द क्यों था। होस्ट किए गए PostgreSQL इंस्टेंस पर विचार करें जिसमें दो भूमिकाएँ हों:
- पोस्टग्रेज (सुपर यूजर)
- जॉनस्मिथ (एक सामान्य उपयोगकर्ता)
और डेटाबेस ऊनीडीबी.
जॉन स्मिथ, वूलीडब में पोस्टग्रेज एक्सटेंशन hstore जोड़ना चाहते हैं, क्योंकि उनका एप्लिकेशन कोड उसी पर निर्भर है। आइए ऐसा करने का प्रयास करें।
psql -U johnsmith -d wooliesdb
wooliesdb=>CREATE EXTENSION hstore;
ERROR: permission denied to create extension "hstore"
HINT: Must be superuser to create this extension.
त्रुटि स्पष्ट रूप से इंगित करती है कि एक्सटेंशन केवल सुपर उपयोगकर्ता यानी पोस्टग्रेज द्वारा ही बनाया जा सकता है। भले ही hstore जैसे एक्सटेंशन को इसके उपयोग के संदर्भ में कोई सुरक्षा चिंता नहीं है, फिर भी यह केवल सुपर उपयोगकर्ता हैं जो डेटाबेस पर इस एक्सटेंशन को बना सकते हैं।
क्या होगा यदि डेटाबेस का स्वामित्व या निर्माण जॉनस्मिथ द्वारा किया गया था - हम इसे भी आजमा सकते हैं। निम्नलिखित स्निपेट में, पोस्टग्रेज सुपरयूसर जॉनस्मिथ को खेलने के लिए अपना खुद का एक नया डेटाबेस बनाने की अनुमति दे रहा है:
$ psql -U postgres
postgres=# ALTER ROLE johnsmith CREATEDB;
postgres=# \q
$ psql -U johnsmith -d wooliesdb
wooliesdb=>CREATE DATABASE jsDB;
wooliesdb=>\c jsDB;
You are now connected to database "jsDB" as user "johnsmith".
jsDB=>CREATE EXTENSION hstore;
ERROR: permission denied to create extension "hstore"
HINT: Must be superuser to create this extension.
आह! इससे कोई फर्क नहीं पड़ता। हालांकि जॉनस्मिथ जेएसडीबी के मालिक हैं, फिर भी वह अपने डेटाबेस में प्रासंगिक, सरल एक्सटेंशन इंस्टॉल नहीं कर सकते हैं।
लेकिन यह सब PostgreSQL सर्वर 12 (और नीचे) में है; यह PostgreSQL संस्करण 13 के साथ बदलने जा रहा है। इस ब्लॉग को लिखने के समय - PostgreSQL संस्करण 13 बीटा 2 चरण में है और टीम पहले से ही एक रिलीज की घोषणा लिख रही है। मैं बीटा2 बायनेरिज़ के साथ "विश्वसनीय एक्सटेंशन" आज़माने जा रहा हूँ।
यहाँ आता है PostgreSQL 13
विश्वसनीय एक्सटेंशन की अवधारणा के साथ एक अलग व्यवहार की अपेक्षा करें (कम से कम कॉन्ट्रिब मॉड्यूल या पूर्व-पैक किए गए एक्सटेंशन के लिए)। आइए PostgreSQL13 के साथ उसी कमांड के लिए व्यवहार की जाँच करें जो हमने PostgreSQL12 के लिए किया था।
$ psql -U johnsmith -d wooliesdb
wooliesdb=>CREATE EXTENSION hstore;
ERROR: permission denied to create extension "hstore"
HINT: Must have CREATE privilege on current database to create this extension.
जो काफी हद तक समान है यानी जॉनस्मिथ अभी भी एक्सटेंशन नहीं बना सकता है। लेकिन फिर भी एक सूक्ष्म अंतर है - HINT जो सुझाव देता है कि CREATE विशेषाधिकार गायब है। हमारे आदेशों के दूसरे सेट को इसका ध्यान रखना चाहिए:
$ psql -U postgres
postgres=# ALTER ROLE johnsmith CREATEDB;
postgres=# \q
$ psql -U johnsmith -d wooliesdb
wooliesdb=>CREATE DATABASE jsDB;
wooliesdb=>\c jsDB;
You are now connected to database "jsDB" as user "johnsmith".
jsDB=>CREATE EXTENSION hstore;
jsDB=>SELECT extname from pg_extension;
extname
---------
plpgsql
hstore
(2 rows)
इस बार चीजें वास्तव में कारगर रहीं। सुपरयुसर निम्नलिखित कमांड को निष्पादित करके डीबी पोस्टग्रेज पर समान विशेषाधिकारों की अनुमति दे सकता है:
postgres=# GRANT CREATE ON DATABASE postgres FOR johnsmith;
लेकिन विश्वसनीय एक्सटेंशन के अलावा और भी बहुत कुछ है, आइए एक और एक्सटेंशन बनाने का प्रयास करें:
jsDB=> create extension file_fdw;
ERROR: permission denied to create extension "file_fdw"
HINT: Must be superuser to create this extension.
अंतर इस तथ्य से आ रहा है कि जबकि hstore को विश्वसनीय के रूप में चिह्नित किया गया है, file_fdw को विश्वसनीय के रूप में चिह्नित नहीं किया गया है। वह कहाँ चिह्नित है? यह एक्सटेंशन की नियंत्रण फ़ाइल में है।
$ cd /usr/pgsql-13/share/extension
$ grep -l trusted hstore.control file_fdw.control;
hstore.control
वास्तव में, 24 विश्वसनीय और 24 इतने विश्वसनीय एक्सटेंशन नहीं हैं जो postgreSQL13 के साथ आ रहे हैं।
संक्षेप में, सुपर उपयोगकर्ता ऐसे विश्वसनीय एक्सटेंशन पर नियंत्रण छोड़ सकते हैं; और डेटाबेस पर क्रिएट अनुमतियों वाला कोई भी उपयोगकर्ता अपने डेटाबेस व्यवस्थापक से संपर्क किए बिना विश्वसनीय एक्सटेंशन सक्षम कर सकता है।
निष्कर्ष
पर्दे के पीछे, एक्सटेंशन नियंत्रण फ़ाइल में व्यवहार को दो मापदंडों द्वारा नियंत्रित किया जाता है:
- सुपरयूज़र, जो डिफ़ॉल्ट रूप से सही होता है
- विश्वसनीय, जो डिफ़ॉल्ट रूप से गलत है
एक गैर-सुपरयूज़र द्वारा एक एक्सटेंशन केवल तभी बनाया जा सकता है जब दोनों सत्य हों। वास्तव में, एक विश्वसनीय एक्सटेंशन इंस्टॉलेशन या अपडेट स्क्रिप्ट को बूटस्ट्रैप सुपरयूज़र के रूप में चलाया जाता है, न कि कॉलिंग उपयोगकर्ता के रूप में। याद रखें कि एक्सटेंशन किसी ऐसी भाषा में लिखे जा सकते हैं जिस पर स्वयं भरोसा नहीं किया जाता है - इसलिए इसकी आवश्यकता है।