Menghindari kesalahan kunci skema eksklusif dengan ArcPy?

11

Saya memiliki skrip untuk memperbarui beberapa fitur pada basis data setiap malam (hanya untuk menyalin dan mengganti beberapa fitur). Fitur ini "hanya-baca". Masalah saya adalah saya tidak dapat menghindari bahwa fitur ini dibuka oleh pengguna, dan skrip saya dapat menampilkan kesalahan berikut:

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

Bisakah saya memaksa skrip phyton, melalui beberapa perintah, menyalin file, bahkan dibuka oleh beberapa pengguna? Bisakah saya menghapus semua koneksi di database saya sebelum menjalankan skrip?

avrechi
sumber
1
Ini tampaknya merupakan kesalahan arcpy / arcgisscripting. Harap konfirmasikan yang Anda gunakan, dan juga database yang Anda gunakan.
blah238

Jawaban:

5

Saya kira Anda bekerja dengan SDE.

Anda harus mematikan semua koneksi menggunakan sdemonalat baris perintah.

  1. Jika ada ArcSDE diinstal pada PC di mana Anda menjalankan skrip maka Anda dapat mengeksekusi sdemon -o killsecara lokal untuk mematikan semua koneksi. Lihatlah topik bantuan ini . Saya tidak yakin apakah itu membunuh koneksi langsung pada 10.0. Saya ingat bahwa itu semacam masalah pada 9.3 dan pasti mematikan koneksi langsung pada 10.1.
  2. Jika Anda tidak menginstal ArcSDE dan hanya berjalan di server terpisah maka Anda dapat menjalankan perintah ini dari jarak jauh dari Python. Ada beberapa diskusi dalam topik ini .
Alex Markov
sumber
Ya, saya menggunakan SDE (diinstal pada server). Tetapi perintah "sdemon -o kill" mengembalikan kesalahan sintaksis.
avrechi
Perintah sdemon harus dijalankan di ArcSDE. Bisakah saya meletakkannya di skrip Python saya?
avrechi
2
Perintah sdemon -o killtidak cukup. Anda harus melewati parameter tambahan, lihat tautan yang disediakan .
Alex Markov
2

Kemungkinan lain karena Anda mengatakan Anda menggunakan SDE adalah menghapus kunci bersama dari layer_locksdan table_lockstabel menggunakan SQL, PL / SQL, T-SQL, dll. Mis:

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

Saya pasti tidak akan merekomendasikan pendekatan ini pada geodatabase versi. Lihat juga: Bagaimana berbagai mekanisme kunci diterapkan di ArcSDE dan geodatabase?

blah238
sumber
2

Jika preferensi adalah untuk menghapus kunci pengguna SDE tertentu, ada cara untuk melakukan ini melalui arcpy . Saya lebih suka pendekatan ini karena tidak mengharuskan Anda melompat ke server database untuk melakukan perintah sde. Saya dapat memutuskan kunci yang tidak diinginkan, kemudian melakukan pembaruan data semua dalam satu skrip / proses.

Contoh dari tautan di atas sangat bermanfaat:

import arcpy

admin_workspace = "Database Connections/[email protected]"
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)
J Graham
sumber
Saya menjalankan ini, dan sepertinya berhasil, hingga mencapai sessionID saya saat ini, dan melemparkan kesalahan. Apakah ada cara untuk mengulangi pengguna dan melewati pengguna saat ini (jika item.Name == 'DBO' dan item.ID! = <ID sesi pengguna saat ini>)? Saya tidak dapat menemukan cara untuk menemukan ID sesi pengguna saat ini.
m.Walker
0

Saya tidak terlalu terbiasa dengan postgresql tapi saya pikir posting ini dapat membawa Anda ke arah yang benar:

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

Nickes
sumber