ArcPy के साथ अनन्य स्कीमा लॉक त्रुटि से बचना?


11

मेरे पास हर रात अपने डेटाबेस पर कुछ सुविधाओं को अपडेट करने के लिए एक स्क्रिप्ट है (बस कुछ विशेषताओं को कॉपी करने और बदलने के लिए)। यह विशेषताएं "केवल पढ़ने के लिए" हैं। मेरी समस्या यह है कि मैं इससे बच नहीं सकता कि ये सुविधाएँ उपयोगकर्ताओं द्वारा खोली गई हैं, और मेरी स्क्रिप्ट निम्न त्रुटि दिखा सकती है:

ExecuteError: ERROR 000464: Cannot get exclusive schema lock. 
              Either being edited or in use by another application.

क्या मैं फाइटन स्क्रिप्ट को, कुछ कमांड के माध्यम से, फाइलों को कॉपी करके, यहां तक ​​कि कुछ उपयोगकर्ता द्वारा खोला जा सकता है? क्या मैं स्क्रिप्ट चलाने से पहले अपने डेटाबेस के सभी कनेक्शनों को हटा सकता हूं?


1
यह एक चापलूसी / संग्रहणीय त्रुटि प्रतीत होता है। कृपया पुष्टि करें कि आप किसका उपयोग कर रहे हैं, और यह भी कि आप किस डेटाबेस का उपयोग कर रहे हैं।
blah238

जवाबों:


5

मुझे लगता है कि आप एसडीई के साथ काम कर रहे हैं।

आपको sdemonकमांड-लाइन टूल का उपयोग करके सभी कनेक्शनों को मारना चाहिए ।

  1. यदि पीसी पर एक आर्कएसडीई स्थापित है जहां आप स्क्रिप्ट चला रहे हैं तो आप sdemon -o killसभी कनेक्शनों को मारने के लिए स्थानीय रूप से निष्पादित कर सकते हैं । इस मदद विषय पर एक नज़र डालें । मुझे यकीन नहीं है कि यह 10.0 पर प्रत्यक्ष-कनेक्शन को मार रहा है। मुझे याद है कि यह 9.3 पर एक तरह की समस्या थी और यह 10.1 पर प्रत्यक्ष-कनेक्शन को मार रही है।
  2. यदि आपके पास ArcSDE स्थापित नहीं है और यह केवल एक अलग सर्वर पर चल रहा है तो आप पायथन से दूरस्थ रूप से इस कमांड को निष्पादित कर सकते हैं। इस विषय में कुछ चर्चा है ।

हां, मैं एसडीई (एक सर्वर पर स्थापित) का उपयोग कर रहा हूं। लेकिन "sdemon -o मार" कमांड ने एक सिंटैक्स त्रुटि दी।
avrechi

आर्कमडी में sdemon कमांड को निष्पादित किया जाना है। क्या मैं इसे अपनी पायथन लिपि में रख सकता हूं?


2
आज्ञा sdemon -o killपर्याप्त नहीं है। आपको अतिरिक्त पैरामीटर पास करना चाहिए, प्रदान किए गए लिंक पर एक नज़र डालें ।
एलेक्स मार्कोव

2

एक और संभावना है के बाद से आप ने कहा आप SDE उपयोग कर रहे हैं से साझा ताले नष्ट करने के लिए है layer_locksऔर table_locksटेबल एसक्यूएल, PL / SQL, T-SQL, आदि जैसे का उपयोग कर:

DELETE FROM TABLE_LOCKS WHERE SDE_ID = :b1 AND REGISTRATION_ID = :b2

मैं निश्चित रूप से एक जियोडेटाबेस पर इस दृष्टिकोण की सिफारिश नहीं करूंगा। यह भी देखें: आर्कएसडीई और जियोडेटाबेस में विभिन्न लॉक तंत्र कैसे लागू होते हैं?


2

यदि प्राथमिकता विशिष्ट एसडीई उपयोगकर्ता ताले को हटाने की है, तो आर्कपी के माध्यम से ऐसा करने का एक तरीका है । मैं इस दृष्टिकोण को पसंद करता हूं क्योंकि यह आवश्यक नहीं है कि आप डेटाबेस कमांड पर एक sde कमांड करने के लिए कूदें। मैं किसी भी अवांछित ताले को काट सकता हूं, फिर सभी डेटा को एक स्क्रिप्ट / प्रक्रिया में अपडेट कर सकता हूं।

उपरोक्त लिंक से उदाहरण बहुत उपयोगी है:

import arcpy

admin_workspace = "Database Connections/tenone@sde.sde"
arcpy.env.workspace = admin_workspace
user_name = "GDB"

# Look through the users in the connected user list and get the SDE ID.
# Use the SDE ID to disconnect the user that matches the username variable
users = arcpy.ListUsers() # The environment is set, no workspace is needed.
for item in users:
    if item.Name == user_name:
        arcpy.DisconnectUser(admin_workspace, item.ID)

मैंने इसे चलाया, और काम करने लगा, जब तक कि यह मेरे वर्तमान सेशन से नहीं टकराया, और एक त्रुटि फेंकी। क्या उपयोगकर्ताओं के माध्यम से लूप करने और वर्तमान उपयोगकर्ता को छोड़ देने का एक तरीका है (यदि item.Name == 'DBO' और item.ID! = <वर्तमान उपयोगकर्ता का सत्र ID>)? मुझे वर्तमान उपयोगकर्ता की सत्र आईडी खोजने का कोई तरीका नहीं मिल रहा है।
m.Walker

0

मैं postgresql से बहुत परिचित नहीं हूँ लेकिन मुझे लगता है कि यह पोस्ट आपको सही दिशा में ले जा सकती है:

/programming/5108876/kill-a-postgresql-session-connection

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