ArcPy ile özel şema kilidi hatasını önleme?


11

Her gece veritabanımda bazı özellikleri güncellemek için bir komut dosyası var (sadece bazı özellikleri kopyalamak ve değiştirmek için). Bu özellikler "salt okunur". Benim sorunum, bu özelliklerin kullanıcılar tarafından açılmasını önleyemem ve betiğim aşağıdaki hatayı gösterebilir:

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

Phyton betiğini bazı komutlar aracılığıyla dosyaları kopyalayabilir, hatta bazı kullanıcılar tarafından açılabilir mi? Komut dosyasını çalıştırmadan önce veritabanımdaki tüm bağlantıları kaldırabilir miyim?


1
Bu bir arcpy / arcgisscripting hatası gibi görünüyor. Lütfen hangisini kullandığınızı ve hangi veritabanını kullandığınızı doğrulayın.
blah238

Yanıtlar:


5

Sanırım SDE ile çalışıyorsunuz.

sdemonKomut satırı aracını kullanarak tüm bağlantıları öldürmelisiniz .

  1. Komut dosyasını çalıştırdığınız bir bilgisayarda yüklü bir ArcSDE varsa, sdemon -o killtüm bağlantıları öldürmek için yerel olarak çalıştırabilirsiniz . Bu yardım konusuna bir göz atın . 10.0'da doğrudan bağlantıları öldürdüğünden emin değilim. 9.3'te bir tür sorun olduğunu ve kesinlikle 10.1'de doğrudan bağlantıları öldürdüğünü hatırlıyorum.
  2. ArcSDE yüklü değilse ve yalnızca ayrı bir sunucuda çalışıyorsa, bu komutu Python'dan uzaktan çalıştırabilirsiniz. Bu konuda bazı tartışmalar var .

Evet, SDE kullanıyorum (sunucuya yüklenmiş). Ancak "sdemon -o kill" komutu bir sözdizimi hatası döndürdü.
avrechi

Sdemon komutu ArcSDE'de yürütülmelidir. Python betiğime koyabilir miyim?
avrechi


2
Komut sdemon -o killyeterli değil. Ek parametreler geçmeli, sağlanan bağlantıya göz atmalısınız .
Alex Markov


2

Tercih belirli SDE kullanıcı kilitlerini kaldırmaksa bunu arcpy ile yapmanın bir yolu vardır . Bir sde komutu gerçekleştirmek için veritabanı sunucusuna atlamanızı gerektirmediği için bu yaklaşımı tercih ederim. İstenmeyen kilitlerin bağlantısını kesebilir, ardından tek bir komut dosyasında / işlemde veri güncellemeleri gerçekleştirebilirim.

Yukarıdaki bağlantıdan örnek çok yararlıdır:

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)

Bunu çalıştırdım ve şu anki oturum kimliğime ulaşana kadar bir iş gibi görünüyordu ve bir hata attı. Kullanıcılar arasında geçiş yapmanın ve geçerli kullanıcıyı atlamanın bir yolu var mı (item.Name == 'DBO' ve item.ID! = <Geçerli kullanıcının oturum kimliği> ise)? Geçerli kullanıcının oturum kimliğini bulmanın bir yolunu bulamıyorum.
m.Walker

0

Postgresql'e çok aşina değilim ama bu yazının sizi doğru yöne götürebileceğini düşünüyorum:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.