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. スクリプトを実行しているPCにArcSDEがインストールされている場合、sdemon -o killローカルで実行してすべての接続を強制終了できます。このヘルプトピックをご覧ください。10.0で直接接続が強制終了されるかどうかはわかりません。9.3では一種の問題であり、10.1では間違いなく直接接続を強制終了することを覚えています。
  2. ArcSDEがインストールされておらず、別のサーバーでのみ実行されている場合は、このコマンドをPythonからリモートで実行できます。このトピックにはいくつかの議論があります

はい、サーバーにインストールされているSDEを使用しています。しかし、「sdemon -o kill」コマンドは構文エラーを返しました。
-avrechi

sdemonコマンドは、ArcSDEで実行する必要があります。Pythonスクリプトに追加できますか?
avrechi


2
コマンドsdemon -o killでは不十分です。追加のパラメーターを渡す必要があります。提供されているリンクをご覧ください
アレックスマルコフ

2

SDEを使用していると言ったため、SQL、PL / SQL、T-SQLなどを使用しlayer_lockstable_locksテーブルから共有ロックを削除することもできます。例:

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

バージョン管理されたジオデータベースでは、このアプローチを絶対にお勧めしません。参照:ArcSDEおよびジオデータベースでは、さまざまなロックメカニズムがどのように実装されていますか?


2

設定が特定のSDEユーザーロックを削除することである場合、arcpyを介してこれを行う方法があります。sdeコマンドを実行するためにデータベースサーバーにジャンプする必要がないため、このアプローチが好まれます。不要なロックをすべて解除し、1つのスクリプト/プロセスでデータの更新をすべて実行できます。

上記のリンクの例は非常に便利です。

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)

私はこれを実行し、現在のセッションIDにヒットし、エラーをスローするまで動作しているように見えました。ユーザーをループして現在のユーザーをスキップする方法はありますか(item.Name == 'DBO'およびitem.ID!= <現在のユーザーのセッションID>の場合)?現在のユーザーのセッションIDを見つける方法が見つかりません。
m。ウォーカー

0

私はpostgresqlにあまり詳しくありませんが、この投稿は正しい方向に導くと思います。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.