क्या PostgreSQL केस संवेदनशील डेटाबेस बना सकता है?


10

मैं Sybase के कुछ संस्करण से PostgreSQL के कुछ कोड पोर्ट कर रहा हूं। यह एक सी एप्लिकेशन है जो सिबेस क्लाइंट लाइब्रेरी का उपयोग करता है। मेरे दृष्टिकोण एक अनुवाद परत है कि करने के लिए कॉल तब्दील लिखना है dbsqlexec()करने के लिए PQexec()(उदाहरण के लिए)। वह हिस्सा ज्यादातर काम कर रहा है।

ऐसा प्रतीत होता है कि Sybase डेटाबेस को केस संवेदी तरीके से (डेटाबेस ऑब्जेक्ट नामों के संबंध में) सेट किया गया है। उदाहरण के लिए, एक WIDGETटेबल और एक widgetटेबल दोनों है । ऐसा लगता है कि इस एप्लिकेशन में कन्वेंशन यह है कि ऑल-अपरकेस नाम वास्तविक डेटा तालिकाओं को इंगित करते हैं, जबकि लोअरकेस नामों को कुछ प्रसंस्करण चलाते समय अस्थायी तालिकाओं के रूप में उपयोग किया जाता है।

४.१ लेक्सिकल स्ट्रक्चर के अनुसार , " मुख्य शब्द और अयोग्य पहचानकर्ता असंवेदनशील होते हैं। " मुझे पता है कि मैं निचले तह में स्वचालित तह को निष्क्रिय करने के लिए पहचानकर्ताओं को डबल-कोट कर सकता हूं, लेकिन मैं यह नहीं चाहता कि लाइनों के ज़िप के माध्यम से मैन्युअल रूप से किया जाए। इस डेटाबेस का उपयोग करने वाला कोड।

क्या डेटाबेस ऑब्जेक्ट पहचानकर्ताओं के लिए इस स्वचालित मामले को तह करने के लिए PostgreSQL को स्थापित करने का एक तरीका है?

मेरा विकल्प कुछ कोड लिखना होगा जो प्रत्येक एसक्यूएल स्टेटमेंट की जांच करता है और प्रत्येक पहचानकर्ता के चारों ओर दोहरे उद्धरण रखता है (यह एक कीवर्ड नहीं है)।


यदि आप ऐसा नहीं करना चाहते हैं तो भी कीवर्ड्स का उपयोग पहचानकर्ताओं के रूप में किया जा सकता है - यदि डबल उद्धृत किया गया है। किसी भी स्थिति में, आप यह सुनिश्चित नहीं कर सकते कि आपके Sybase कोड आधार के कुछ पहचानकर्ता PostgreSQL में कीवर्ड नहीं हैं। पहचानकर्ताओं को डबल-कोट करने के लिए सभी अधिक कारण या, अधिमानतः, उन लोगों का नाम बदलें।
इरविन ब्रान्डेसटेटर

पोस्टग्रेज में अयोग्य पहचानकर्ता वास्तव में असंवेदनशील नहीं हैं, उन्हें सभी निचले मामलों के रूप में माना जाता है। इसलिए tAbLeNaMe टैब्लेम नाम की एक एकल तालिका से मेल खाएगा, लेकिन टेबलनेम नामक एक भी नहीं। मैं तालिकाओं का नाम बदल दूंगा क्योंकि अन्यथा लोग भूल जाएंगे "और गलती से लोअरकेस संस्करण को एक्सेस करने के लिए समाप्त हो जाएगा।
जेम्सन

@JamesRyan: यह गलत है। select * from TaBlEnAmEउसी तालिका को select * from tablenameयाselect * from TABLENAME
a_horse_with_no_name

@a_horse_with_no_name: यदि आप create table "tableName" (id integer primary key);, और फिर create table "tablename" (id integer primary key);यह क्वेरी select * from TaBlEnAmE;"टैबलेन" से चुनेंगी , तो "टेबलनेम" से नहीं। "अधूरे नाम हमेशा लोअरकेस में बदल जाते हैं"
माइक शेरिल 'कैट रिकॉल'

जवाबों:


3

मैंने कुछ कोड लिखना समाप्त कर दिया है जो एप्लिकेशन द्वारा उत्पन्न SQL को PostgreSQL- संगत SQL में बदल देता है। यह बहुत सीधा है:

  • बयान को समझदार टोकन में विभाजित करें, एकल-उद्धृत स्ट्रिंग शाब्दिकों को छोड़ दें
  • ऐसी किसी भी चीज़ को डबल-कोट करें जो कोई कीवर्ड या नंबर न हो

मैंने कॉल करने के isnullलिए कॉल करने के लिए इस लेयर का भी फायदा उठाया coalesce। अब तक यह बहुत अच्छा काम कर रहा है।


मैं इसे संवेदनशील बनाने के लिए उद्धरण ("ब्लाब्लाब्ला") का उपयोग करता हूं .. यह मेरे लिए आसान काम करता है ..
अनुज पटेल

1

क्या डेटाबेस ऑब्जेक्ट पहचानकर्ताओं के लिए इस स्वचालित मामले को तह करने के लिए PostgreSQL को स्थापित करने का एक तरीका है?

प्रत्यक्ष नहीं। आप PostgreSQL स्रोत कोड में अपेक्षाकृत मामूली बदलाव करने में सक्षम हो सकते हैं , और इसे फिर से जोड़ सकते हैं। (शुरू में src / backend / parser / parser.c?) लेकिन मुझे आश्चर्य होगा अगर यह बहुत सरल था।


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