यह वास्तव में उत्तर नहीं है बल्कि एक संक्षिप्त व्याख्या है कि त्रुटि के स्रोत को कैसे खोजा जाए।
सबसे पहले pgcrypto
. को खोजें विस्तार:
select e.extname, n.nspname
from pg_catalog.pg_extension e left join pg_catalog.pg_namespace n on n.oid = e.extnamespace;
इसे कुछ इस तरह वापस करना चाहिए:
╔════════════════════╤════════════╗
║ extname │ nspname ║
╠════════════════════╪════════════╣
║ plpgsql │ pg_catalog ║
║ adminpack │ pg_catalog ║
║ plpythonu │ pg_catalog ║
║ pg_stat_statements │ public ║
║ plpython3u │ pg_catalog ║
║ hstore │ public ║
║ uuid-ossp │ public ║
║ pg_trgm │ public ║
║ ltree │ public ║
║ tablefunc │ public ║
║ unaccent │ public ║
║ pgcrypto │ nd ║
╚════════════════════╧════════════╝
तो pgcrypto
स्कीमा में स्थापित nd
मेरे डेटाबेस में।
इसके बाद search_path
पर नजर डालते हैं पैरामीटर जो जानकारी प्रदान करता है कि DB वस्तुओं को कहाँ खोजा जाए:
show search_path;
╔═════════════════╗
║ search_path ║
╠═════════════════╣
║ "$user", public ║
╚═════════════════╝
इसका अर्थ है कि ऑब्जेक्ट को वर्तमान उपयोगकर्ता के नाम के साथ स्कीमा में खोजा जाएगा और, यदि कुछ नहीं मिला, तो स्कीमा public
में खोजा जाएगा। ।
अंत में वर्तमान उपयोगकर्ता की जाँच करें:
select current_user;
╔══════════════╗
║ current_user ║
╠══════════════╣
║ postgres ║
╚══════════════╝
तो जैसा कि आप स्कीमा में स्थापित एक्सटेंशन को देख सकते हैं nd
search_path
. का उपयोग करके नहीं ढूंढा जा सकता जो वास्तव में postgres, public
. है और हमें त्रुटि मिली:
select gen_salt('md5');
ERROR: function gen_salt(unknown) does not exist
LINE 1: select gen_salt('md5');
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
ऊपर बताए गए आपके डीबी के वास्तविक मूल्यों के आधार पर इसे ठीक करने के कई तरीके हैं।
आप एक्सटेंशन को किसी अन्य स्कीमा में स्थानांतरित कर सकते हैं जैसे:
alter extension pgcrypto set schema public;
आप search_path
बदल सकते हैं विकल्प जैसे:
set search_path to '"$user", public'; -- for the active session only
alter database your_db_name set search_path to '"$user", public'; -- permanently for the database
अंत में आप SQL कथन में स्कीमा को स्पष्ट रूप से निर्दिष्ट कर सकते हैं:
select schema_where_it_installed.gen_salt('md5');
-- For my example:
select nd.gen_salt('md5');