หลีกเลี่ยงข้อผิดพลาดล็อคคีมาแบบเอกสิทธิ์ด้วย ArcPy?


11

ฉันมีสคริปต์สำหรับอัปเดตคุณสมบัติบางอย่างในฐานข้อมูลของฉันทุกคืน (เพียงเพื่อคัดลอกและแทนที่คุณสมบัติบางอย่าง) คุณสมบัตินี้เป็น "อ่านอย่างเดียว" ปัญหาของฉันคือฉันไม่สามารถหลีกเลี่ยงได้ว่าคุณลักษณะเหล่านี้เปิดโดยผู้ใช้และสคริปต์ของฉันสามารถแสดงข้อผิดพลาดต่อไปนี้:

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

ฉันสามารถบังคับใช้สคริปต์ phyton ผ่านคำสั่งบางคำคัดลอกไฟล์แม้กระทั่งเปิดโดยผู้ใช้บางคนได้หรือไม่ ฉันสามารถลบการเชื่อมต่อทั้งหมดในฐานข้อมูลของฉันก่อนที่จะเรียกใช้สคริปต์ได้หรือไม่


1
นี่ดูเหมือนจะเป็นข้อผิดพลาด arcpy / arcgisscripting โปรดยืนยันว่าคุณกำลังใช้งานอยู่และฐานข้อมูลใดที่คุณกำลังใช้
blah238

คำตอบ:


5

ฉันคิดว่าคุณกำลังทำงานกับ SDE

คุณควรฆ่าการเชื่อมต่อทั้งหมดโดยใช้sdemonเครื่องมือบรรทัดคำสั่ง

  1. หากมีการติดตั้ง ArcSDE บนพีซีที่คุณเรียกใช้สคริปต์คุณสามารถดำเนินการsdemon -o killภายในเครื่องเพื่อฆ่าการเชื่อมต่อทั้งหมด ลองดูที่นี้หัวข้อความช่วยเหลือ ฉันไม่แน่ใจว่ามันฆ่าการเชื่อมต่อโดยตรงบน 10.0 ฉันจำได้ว่ามันเป็นปัญหาอย่างหนึ่งใน 9.3 และมันฆ่าการเชื่อมต่อโดยตรงบน 10.1 อย่างแน่นอน
  2. หากคุณไม่ได้ติดตั้ง ArcSDE และมันกำลังทำงานบนเซิร์ฟเวอร์แยกต่างหากเท่านั้นคุณสามารถดำเนินการคำสั่งนี้จากระยะไกลจาก Python มีการอภิปรายในหัวข้อนี้

ใช่ฉันใช้ SDE (ติดตั้งบนเซิร์ฟเวอร์) แต่คำสั่ง "sdemon -o kill" ส่งคืนข้อผิดพลาดทางไวยากรณ์
avrechi

คำสั่ง sdemon จะต้องดำเนินการใน ArcSDE ฉันสามารถใส่มันลงในสคริปต์ Python ของฉันได้ไหม?
avrechi

1
ลองดูโมดูลย่อย นอกจากนี้ยังมีคำถามที่ดีที่นี่: วิธีการเรียกคำสั่งภายนอกในหลามและเรียกใช้คำสั่งจากเปลือกหลามและจับเอาท์พุท
Alex Markov

2
คำสั่งsdemon -o killไม่เพียงพอ คุณควรส่งพารามิเตอร์เพิ่มเติมดูลิงค์ที่ให้ไว้
Alex Markov

2

ความเป็นไปได้อีกประการหนึ่งเนื่องจากคุณบอกว่าคุณกำลังใช้ SDE คือการลบการล็อคที่ใช้ร่วมกันจากlayer_locksและtable_locksตารางโดยใช้ SQL, PL / SQL, T-SQL ฯลฯ เช่น:

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

ฉันจะไม่แนะนำวิธีนี้ในฐานข้อมูลทางภูมิศาสตร์ที่มีเวอร์ชัน ดูเพิ่มเติมที่: กลไกการล็อคต่าง ๆ นำไปใช้ใน ArcSDE และฐานข้อมูลทางภูมิศาสตร์อย่างไร


2

หากการตั้งค่าคือการลบล็อคผู้ใช้ SDE เฉพาะมีวิธีที่จะทำเช่นนี้ผ่าน arcpy ฉันชอบวิธีนี้เพราะไม่ต้องการให้คุณข้ามไปยังเซิร์ฟเวอร์ฐานข้อมูลเพื่อดำเนินการคำสั่ง 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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.