पढ़ने-लिखने के लिए SQLite डेटाबेस मोड बदलें


101

मैं केवल पढ़ने-लिखने के लिए SQLite डेटाबेस को कैसे बदल सकता हूं?

जब मैंने अपडेट स्टेटमेंट निष्पादित किया, तो मुझे हमेशा मिला:

SQL त्रुटि: एक आसानी से डेटाबेस लिखने का प्रयास

SQLite फ़ाइल फ़ाइल सिस्टम पर एक लेखन योग्य फ़ाइल है।


3
क्या उपयोगकर्ता sqlite3 (या जो कुछ भी आप क्वेरी को निष्पादित करने के लिए उपयोग कर रहे हैं) में db को लिखने की अनुमति है? क्या आपने फ़ाइल की स्वामित्व की दोहरी जाँच की है?
टिम पोस्ट Tim

मुझे यकीन है कि उनके पास इसे करने की अनुमति है।
user143482

2
मैंने इसे एक वेब ऐप में देखा है जहां मैं डेटाबेस फ़ाइल और "www-data" खाते पर जीआईडी ​​सेट करना भूल गया था (जो कि अपाचे चलाता है) को फ़ाइल तक पहुंच लिखने से मना कर दिया गया था।
18

जवाबों:


86

इस त्रुटि संदेश के कई कारण हो सकते हैं:

  • कई प्रक्रियाओं में एक ही समय में डेटाबेस खुला होता है ( FAQ देखें )।

  • डेटाबेस को संपीड़ित और एन्क्रिप्ट करने के लिए एक प्लगइन है। यह DB को संशोधित करने की अनुमति नहीं देता है।

  • अंत में, एक अन्य FAQ कहता है: "सुनिश्चित करें कि डेटाबेस फ़ाइल वाली निर्देशिका भी CGI स्क्रिप्ट को निष्पादित करने वाले उपयोगकर्ता के लिए उपयुक्त है।" मुझे लगता है कि यह इसलिए है क्योंकि इंजन को डायरेक्टरी में अधिक फाइल बनाने की आवश्यकता है।

  • पूरे फाइल सिस्टम को केवल दुर्घटना के बाद उदाहरण के लिए पढ़ा जा सकता है।

  • यूनिक्स प्रणालियों पर, एक अन्य प्रक्रिया पूरी फ़ाइल को बदल सकती है।


26
मैं तीसरी गोली पर अपनी बोली लगाऊंगा - डीबी फ़ाइल वाली निर्देशिका भी लिखने योग्य होनी चाहिए ताकि लॉक फ़ाइल बनाई जा सके।
किम्विस

मेरे लिए पहली गोली: डी
विनय

अंतिम बाला। मैं हमेशा सूडो को भूल जाता हूं: P
स्टॉर्म

3
मैं इस सूची में जोड़ सकता हूं: डेटाबेस फ़ाइल को उपयोग के दौरान बदल दिया गया था। मैं इस निष्कर्ष पर जाने वाली मूर्खता को स्पष्ट नहीं करना चाहता।
रिम रिजर्स

इसे उत्तर के रूप में चिह्नित किया जाना चाहिए। मेरे मामले में (एक डेस्कटॉप ऐप), यह मुख्य हार्ड डिस्क अंतरिक्ष में बहुत कम होने के कारण डेटाबेस से संबंधित विंडोज कंप्रेसिंग से संबंधित था। मुझे लगता है कि खिड़कियां उपयोगकर्ता से पूछेंगी कि क्या वह अंतरिक्ष प्राप्त करने के लिए फ़ाइलों को संपीड़ित करना चाहता है यदि उपयोगकर्ता हाँ कहता है तो केवल-पढ़ने के लिए डेटाबेस समस्या उत्पन्न हो सकती है।
नंदस्तोले

10

मैंने इसे सभी फाइलों पर / db dir पर रूट से मालिक को बदलकर हल किया।

बस ls -lउस फ़ोल्डर पर करते हैं , अगर किसी भी फाइलर के स्वामित्व में है root, तो इसे केवल आपको बदलकर, उपयोग करके:sudo chown user file


5

यह त्रुटि आमतौर पर तब होती है जब आपका डेटाबेस पहले से ही एक एप्लिकेशन द्वारा एक्सेस किया जाता है, और आप इसे किसी अन्य एप्लिकेशन के साथ एक्सेस करने का प्रयास कर रहे हैं।


आप एक डेटाबेस को दूसरे डेटाबेस से एक्सेस करने की कोशिश क्यों करेंगे?
पीटर मोर्टेंसन

मुझे लगता है कि वह
अमौरमार्टिनी

4

अगर Android का उपयोग कर रहे हैं।

सुनिश्चित करें कि आपने अपने EXTERNAL_STORAGEको लिखने की अनुमति जोड़ दी हैAndroidManifest.xml

इस लाइन को AndroidManifest.xmlअपने <application>टैग के ऊपर और बाहर अपनी फ़ाइल में जोड़ें ।

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

यह आपके एप्लिकेशन को sdcard को लिखने की अनुमति देगा। यह मदद करेगा यदि आपका EXTERNAL_STORAGEवह स्थान है जहां आपने अपने डेटाबेस को डिवाइस पर संग्रहीत किया है।


इससे मेरी समस्या हल हो गई। मैंने अधिक विवरण देने और पढ़ने में आसान होने के लिए प्रश्न को संशोधित किया।
prolink007

बहुत बहुत धन्यवाद। इससे मेरी समस्या भी हल हो गई। एक वोट फॉर :)
अल्ताफ सामी

4

लिनक्स कमांड शेल में, मैंने किया:

chmod 777 <db_folder>

जहाँ डेटाबेस फ़ाइल है।

यह काम करता हैं। अब मैं अपने डेटाबेस को एक्सेस कर सकता हूं और इंसर्ट कर सकता हूं।


सुरक्षा निहितार्थ क्या हैं?
पीटर मोर्टेंसन


1
यह त्वरित समाधान के रूप में काम करता है, लेकिन बाद में बेहतर सुरक्षित समाधान के लिए खुदाई करने की आवश्यकता है
troydo42

4
यह सभी उपयोगकर्ताओं को सभी अनुमतियाँ प्रदान करेगा, जो संभवत: सुरक्षा दृष्टिकोण से आप नहीं चाहते हैं।
रेनेल चेसक

3

(यह त्रुटि संदेश आम तौर पर भ्रामक है, और आमतौर पर एक सामान्य अनुमति त्रुटि है)

विंडोज पर

  • यदि आप SQL को डेटाबेस से सीधे जारी कर रहे हैं, तो सुनिश्चित करें कि SQL चलाने के लिए आप जो भी एप्लिकेशन उपयोग कर रहे हैं, वह व्यवस्थापक के रूप में चल रहा है
  • यदि कोई एप्लिकेशन अपडेट का प्रयास कर रहा है, तो वह डेटाबेस का उपयोग करने के लिए उपयोग होने वाले खाते को आपकी डेटाबेस फ़ाइल वाले फ़ोल्डर पर अनुमतियों की आवश्यकता हो सकती है। उदाहरण के लिए, यदि IIS डेटाबेस एक्सेस कर रहा है, तो IUSR और IIS_IUSRS दोनों को उपयुक्त अनुमतियों की आवश्यकता हो सकती है (आप इन खातों को अस्थायी रूप से फ़ोल्डर पर पूर्ण नियंत्रण देकर यह जांच कर सकते हैं कि क्या यह काम करता है, तो अनुमतियों को उचित तरीके से बांधना।

1
मुझे प्रशासक के रूप में "डीबी ब्राउज़र" चलाना था।
एबेन रौक्स

1
मैंने विंडोज 10 पर "सभी" को "पूर्ण नियंत्रण" दिया, और यह अभी भी काम नहीं करेगा। हालाँकि, जैसा कि @EbenRoux ने कहा है, आपको प्रशासक के रूप में "DB ब्राउज़र" चलाने की आवश्यकता हो सकती है, जिसने इसे मेरे लिए काम किया।
शांति

2

मुझे आज भी यह समस्या थी।

यह विंडोज़ मोबाइल पर ActiveSync के कारण हुआ था - मैं जिस फोल्डर में काम कर रहा था, उसे सिंक किया गया था, इसलिए AS प्रक्रिया ने समय-समय पर डीबी फ़ाइल को इस त्रुटि के कारण पकड़ा।


1

लिनक्स पर, डेटाबेस फ़ाइल वाले पूरे फ़ोल्डर को पढ़ने / लिखने की अनुमति दें।

इसके अलावा, SELinux लेखन को अवरुद्ध कर सकता है। आपको सही अनुमतियां सेट करने की आवश्यकता है।

मेरे SELinux Management GUI (फेडोरा 19 पर) में, मैंने httpd_unified (सभी सामग्री फ़ाइलों के HTTPD हैंडलिंग को यूनिफ़ाइड लेबल) पर बॉक्स को चेक किया, और मैं जाने के लिए अच्छा था।


किसके लिए अनुमतियाँ पढ़ें / लिखें?
पीटर मोर्टेंसन

कैसे जांच करें और सेट करें?
SynCap

1

व्यक्तिगत अनुभव साझा करने के लिए मुझे इस त्रुटि का सामना करना पड़ा जो अंततः दोनों को ठीक करता है। आवश्यक रूप से आपके मुद्दे से संबंधित नहीं हो सकता है, लेकिन ऐसा प्रतीत होता है कि यह त्रुटि इतनी सामान्य है कि इसे गज़िलियन चीजों के लिए जिम्मेदार ठहराया जा सकता है।

  1. डेटाबेस उदाहरण एक अन्य अनुप्रयोग में खुला। मेरा DB एक "लॉक" अवस्था में रहा है, इसलिए यह केवल मोड पढ़ने के लिए संक्रमण करता है। मैं DB साझा करने वाले एप्लिकेशन का दूसरा उदाहरण रोककर इसे ट्रैक करने में सक्षम था।

  2. निर्देशिका ट्री अनुमति - कृपया सुनिश्चित करें कि उपयोगकर्ता खाते की अनुमति न केवल फ़ाइल स्तर पर बल्कि पूरे ऊपरी निर्देशिका स्तर पर सभी स्तर / स्तर तक है।

धन्यवाद


1

उबंटू पर, मालिक को अपाचे समूह में बदलें और सही अनुमति दें (नहीं, यह 777 नहीं है):

sudo chgrp www-data <path to db.sqlite3>
sudo chmod 664 <path to db.sqlite3>

अपडेट करें

आप समूह और उपयोगकर्ता के लिए अनुमतियाँ भी सेट कर सकते हैं ।

sudo chown www-data:www-data <path to db.sqlite3>

4
आपने केवल समूह को बदल दिया है , न कि उपयोगकर्ता (जो कि ठीक है, और शायद उपयोगकर्ता को बदलने से बेहतर है, लेकिन आपका उत्तर भ्रामक है)।
शुभ

आपको क्या लगता है कि फाइल अपाचे उपयोगकर्ता / समूह की होनी चाहिए?
मर्फी

0

कमांड लाइन से, उस फ़ोल्डर में प्रवेश करें जहां आपकी डेटाबेस फ़ाइल स्थित है और निम्नलिखित कमांड निष्पादित करें:

chmod 777 databasefilename

यह सभी उपयोगकर्ताओं को सभी अनुमतियां प्रदान करेगा।


22
जो काफी खराब है।
मार्को केरविट

सही जवाब!
जितेश प्रजापति

यह इस समस्या को हल कर सकता है, लेकिन इसकी अनुशंसा नहीं की जाती है क्योंकि इससे सुरक्षा समस्या हो सकती है।
काथिर राज

0

विंडोज पर:

tl; dr: फ़ाइल को फिर से खोलने का प्रयास करें।

हमारा सिस्टम इस समस्या को झेल रहा था, और यह निश्चित रूप से एक अनुमति मुद्दा नहीं था, क्योंकि कार्यक्रम ही डेटाबेस को कई थ्रेड्स से अधिकांश समय के लिए लिखने योग्य बनाने में सक्षम होगा, लेकिन कभी-कभी (केवल विंडोज़ पर, ओएसएक्स पर नहीं), एक सूत्र को ये त्रुटियां मिलेंगी, जबकि कार्यक्रम के अन्य सभी सूत्र में कोई कठिनाई नहीं थी।

हमने अंततः पता लगाया कि जो थ्रेड फेल हो रहे थे, केवल वे ही थे जो डेटाबेस को खोलने की कोशिश कर रहे थे कि एक और धागा बंद हो जाने के तुरंत बाद (केवल 1 एमएस के भीतर)। हमने अनुमान लगाया कि समस्या इस तथ्य के कारण थी कि विंडोज (या विंडोज़ के तहत साइक्लाईट कार्यान्वयन) हमेशा फ़ाइल के बंद होने पर फ़ाइल संसाधनों को तुरंत साफ नहीं करता है। खोलने के बाद db के खिलाफ टेस्ट राइट क्वेरी चलाकर हमने इसे प्राप्त किया (जैसे, तब एक मूर्खतापूर्ण नाम के साथ एक टेबल को छोड़ना)। यदि बनाने / छोड़ने में विफल रहा, तो हमने 50 एमएस के लिए इंतजार किया और दोबारा कोशिश की, जब तक कि हम सफल नहीं हुए या 5 सेकंड बीत गए।

इसने काम कर दिया; जाहिर है कि डिस्क में फ्लश करने के लिए संसाधनों के लिए पर्याप्त समय होना चाहिए।


-1

डीबी को संपादित करें: मुझे db को संपादित करने में समस्या आ रही थी। मैंने
'नॉन रूट यूज़रनेम' ts3server.sqlitedb को सुडो चाउन करवाया
जब तक यह रूट नहीं था, तब तक मैं था, मैं फाइल को एडिट कर सकता था। उपयोगकर्ता नाम मेरे गैर रूट खाते का उपयोगकर्ता नाम है।

स्वतः प्रारंभ टीमस्पीक: अपने नॉन रूट खाते
crontab -e
@reboot / पथ के रूप में ts3server / aka /home/ts3server/ts3server_startscript.sh start


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.