PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

plpgsql फ़ंक्शन में तालिका और स्तंभ नामों को तर्क के रूप में परिभाषित करें?

आपको SQL इंजेक्शन से बचाव करना चाहिए जब भी आप उपयोगकर्ता इनपुट को कोड में बदलते हैं। इसमें सिस्टम कैटलॉग से या सीधे उपयोगकर्ता इनपुट से समान रूप से आने वाले टेबल और कॉलम नाम शामिल हैं। इस तरह आप गैर-मानक पहचानकर्ताओं के साथ छोटे अपवादों को भी रोकते हैं। मूल रूप से तीन . हैं अंतर्निहित तरीके:

<एच3>1. format()

पहली क्वेरी, सैनिटाइज़ की गई:

CREATE OR REPLACE FUNCTION foo(_t text)
  RETURNS void
  LANGUAGE plpgsql AS
$func$
BEGIN
   EXECUTE format('
   ALTER TABLE %I ADD COLUMN c1 varchar(20)
                , ADD COLUMN c2 varchar(20)', _t);
END
$func$;

format() पोस्टग्रेज 9.1 या बाद के संस्करण की आवश्यकता है। इसका उपयोग %I . के साथ करें प्रारूप विनिर्देशक।

अकेले तालिका का नाम अस्पष्ट हो सकता है। गलती से गलत टेबल बदलने से बचने के लिए आपको स्कीमा नाम देना पड़ सकता है। संबंधित:

  • ट्रिगर फ़ंक्शन में गतिशील तालिका नाम के साथ INSERT
  • खोज_पथ पहचानकर्ता संकल्प और "वर्तमान स्कीमा" को कैसे प्रभावित करता है

इसके अलावा:एकाधिक कॉलम जोड़ना एक ALTER TABLE . के साथ आदेश सस्ता है।

<एच3>2. regclass

आप एक पंजीकृत वर्ग के लिए कास्ट का उपयोग भी कर सकते हैं (regclass ) मौजूदा . के विशेष मामले के लिए टेबल नाम। वैकल्पिक रूप से स्कीमा-योग्य। यह तालिका नामों के लिए तुरंत और इनायत से विफल हो जाता है जो कॉलिंग उपयोगकर्ता के लिए मान्य और दृश्यमान नहीं हैं। पहली क्वेरी को कास्ट के साथ regclass . पर सैनिटाइज़ किया गया :

CREATE OR REPLACE FUNCTION foo(_t regclass)
  RETURNS void
  LANGUAGE plpgsql AS
$func$
BEGIN
   EXECUTE 'ALTER TABLE ' || _t || ' ADD COLUMN c1 varchar(20)
                                   , ADD COLUMN c2 varchar(20)';
END
$func$;

कॉल करें:

SELECT foo('table_name');

या:

SELECT foo('my_schema.table_name'::regclass);

इसके अलावा:केवल text का उपयोग करने पर विचार करें varchar(20) . के बजाय ।

<एच3>3. quote_ident()

दूसरी क्वेरी को सैनिटाइज किया गया:

CREATE OR REPLACE FUNCTION foo(_t regclass, _c text)
  RETURNS void
  LANGUAGE plpgsql AS
$func$
BEGIN
   EXECUTE 'UPDATE ' || _t    -- sanitized with regclass
        || ' SET ' || quote_ident(_c) || ' = ''This is a test''';
END
$func$;

एकाधिक संयोजनों / प्रक्षेपों के लिए, format() क्लीनर है...

संबंधित उत्तर:

  • तालिका नाम PostgreSQL फ़ंक्शन पैरामीटर के रूप में
  • फ़ंक्शन बनाम तैयार क्वेरी पोस्ट करता है

केस संवेदनशील!

ध्यान रखें कि गैर-उद्धृत पहचानकर्ता नहीं हैं यहां लोअर केस में कास्ट करें। जब SQL में पहचानकर्ता के रूप में उपयोग किया जाता है [पोस्टग्रेस स्वचालित रूप से कम मामले में कास्ट करता है] [7]। लेकिन यहाँ हम स्ट्रिंग्स . पास करते हैं गतिशील एसक्यूएल के लिए। प्रदर्शन के रूप में बच निकलने पर, CaMel-केस आइडेंटिफ़ायर (जैसे UserS .) ) दोहरा उद्धरण ("UserS" . द्वारा संरक्षित किया जाएगा ), अन्य गैर-मानक नामों की तरह जैसे "name with space" "SELECT" आदि। इसलिए, इस संदर्भ में नाम संवेदनशील हैं।

मेरी स्थायी सलाह है कि कानूनी लोअर केस आइडेंटिफ़ायर का विशेष रूप से उपयोग करें और इसके बारे में कभी चिंता न करें।

इसके अलावा:सिंगल कोट्स मूल्यों के लिए हैं, डबल कोट्स पहचानकर्ताओं के लिए हैं। देखें:

  • https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL में सम्मिलन प्रदर्शन को कैसे तेज करें

  2. PostgreSQL डेटाबेस में सभी दृश्यों को कैसे सूचीबद्ध करें

  3. विंडो फ़ंक्शन और अधिक स्थानीय एकत्रीकरण

  4. SQL क्वेरी में (func ()).* सिंटैक्स के साथ एकाधिक फ़ंक्शन evals से कैसे बचें?

  5. PostgreSQL में "त्रुटि:  प्रत्येक EXCEPT क्वेरी में समान संख्या में कॉलम होने चाहिए" को ठीक करें