पीएसक्यूएल SET डॉलर-उद्धृत स्ट्रिंग्स के अंदर चर को प्रक्षेपित नहीं किया जाता है। मैं यह निश्चित रूप से नहीं जानता, लेकिन मुझे लगता है कि SET चालू करने के लिए कोई बच निकलने या अन्य चालबाजी नहीं है वहाँ में परिवर्तनशील प्रक्षेप।
कोई सोच सकता है कि आप एक गैर-उद्धृत :user . को काट सकते हैं वांछित प्रभाव प्राप्त करने के लिए पीएल/पीजीएसक्यूएल के दो डॉलर-उद्धृत हिस्सों के बीच। लेकिन यह काम नहीं कर रहा है ... मुझे लगता है कि सिंटैक्स के लिए एक स्ट्रिंग की आवश्यकता होती है, न कि स्ट्रिंग्स को जोड़ने वाली अभिव्यक्ति। उस पर गलती हो सकती है।
वैसे भी, इससे कोई फर्क नहीं पड़ता। एक और दृष्टिकोण है (जैसा कि पास्को ने नोट किया है):पीएल/पीजीएसक्यूएल तर्क स्वीकार करने के लिए संग्रहीत प्रक्रिया लिखें। यह ऐसा दिखाई देगा।
CREATE OR REPLACE FUNCTION foo("user" TEXT) RETURNS void AS
$$
BEGIN
EXECUTE 'GRANT SELECT ON my_table TO GROUP ' || quote_ident(user);
END;
$$ LANGUAGE plpgsql;
इस फ़ंक्शन पर नोट्स:
EXECUTEएक उपयुक्तGRANTउत्पन्न करता है हमारे प्रक्रिया तर्क पर प्रत्येक आमंत्रण पर। "डायनामिक कमांड निष्पादित करना "EXECUTEके बारे में बताता है विस्तार से।- प्रक्रिया तर्क की घोषणा
userदोहरा उद्धृत किया जाना चाहिए। दोहरे उद्धरण इसे एक पहचानकर्ता के रूप में व्याख्या करने के लिए मजबूर करते हैं।
एक बार जब आप फ़ंक्शन को इस तरह परिभाषित कर लेते हैं, तो आप इसे इंटरपोलेटेड पीएसक्यूएल चर का उपयोग करके कॉल कर सकते हैं। यहाँ एक रूपरेखा है।
- चलाएँ
psql --variable user="'whoever'" --file=myscript.sql. उपयोगकर्ता नाम के आसपास एकल उद्धरण आवश्यक हैं! - myscript.sql में, ऊपर की तरह फ़ंक्शन को परिभाषित करें।
- myscript.sql में,
select foo(:user);. डालें . यह वह जगह है जहां हम उन एकल उद्धरणों पर भरोसा करते हैं जिन्हें हमuser. के मूल्य में रखते हैं .
हालांकि यह काम करने लगता है, यह मुझे स्क्वीयरली के रूप में प्रभावित करता है। मैंने सोचा SET चर रनटाइम कॉन्फ़िगरेशन के लिए अभिप्रेत थे। SET . में डेटा ले जाना अजीब लगता है।
संपादित करें :यहाँ नहीं का एक ठोस कारण है SET का उपयोग करें चर। मैनपेज से:"ये असाइनमेंट स्टार्टअप के बहुत शुरुआती चरण के दौरान किए जाते हैं, इसलिए आंतरिक उद्देश्यों के लिए आरक्षित चर बाद में अधिलेखित हो सकते हैं।" यदि Postgres ने user . नामक चर का उपयोग करने का निर्णय लिया है (या जो भी आप चुनते हैं), यह आपके स्क्रिप्ट तर्क को उस चीज़ से अधिलेखित कर सकता है जिसका आपने कभी इरादा नहीं किया था। वास्तव में, psql पहले से ही USER लेता है अपने लिए -- यह केवल इसलिए काम करता है क्योंकि SET केस सेंसिटिव है। इसने शुरू से ही चीजों को लगभग तोड़ दिया!