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?


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 .

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

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/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)

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.